the client/server application is not working correctly

43 views Asked by At

When I launch server.cpp then I immediately get the phrase "Client Connected!", although I have not launched the application for client.cpp yet. When I launch the application for client.cpp, I have nothing output in the console.

I understand that this happens to me because I have an application running server.cpp and the variable newConnection is equal to 18446744073709551615 for some reason. I tried changing ports, IP addresses, but nothing helps.

server.cpp

#include <iostream>//библиотека ввода вывода
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>//библиотека windows для работы с сетью
#pragma warning(disable: 4996)
using namespace std;

int main() {
    //подключили библиотеку
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &wsaData) != 0) {
        cout << "Error" << endl;
        exit(1);
    }//1-ый параметр запрашиваемая версия библиотеки


    //заполнение информации об адресе сокета
    SOCKADDR_IN addr;//название интернет протокола
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("172.2.2.2");//хранит ip адрес 
    addr.sin_port = htons(4321);//порт
    addr.sin_family = AF_INET;//симейство протоколов


    //для установления соединения
    //прослушивание на определенном порту
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);//создание сокета, SOCK_STREAM - протокол, который устанавливает соединение
    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));//привязываем адрес и порт к сокету, 2-ой параметр - указатель на SOCKADDR_IN adrr, 3-ий - размер SOCKADDR_IN adrr
    //прослушивание порта в ожидании соединения со стороны клиента
    listen(sListen, SOMAXCONN);//SOMAXCONN - максимальное число запрос ожидающих обработки


    //новый сокет чтобы удерживать соединение с клиентом
    SOCKET newConnection;
    newConnection = accept(sListen, (SOCKADDR*)&addr, &sizeofaddr); //accept возвращает указатель на новый сокет. второй параметр будет содержать ip адрес клиента, который произвел подключение

    if (newConnection == 0) {
        cout << "Error #2\n";
    }
    else {
        cout << "Client Connected!\n" << newConnection;
    }

    system("pause");
    return 0;
}

client.cpp

#include <iostream>//библиотека ввода вывода
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>//библиотека windows для работы с сетью
#pragma warning(disable: 4996)
using namespace std;

int main() {
    //подключили библиотеку
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &wsaData) != 0) {
        cout << "Error" << endl;
        exit(1);
    }//1-ый параметр запрашиваемая версия библиотеки


    //заполнение информации об адресе сокета
    SOCKADDR_IN addr;//название интернет протокола
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("172.2.2.2");//хранит ip адрес 
    addr.sin_port = htons(4321);//порт
    addr.sin_family = AF_INET;//симейство протоколов


    //создание сокета для соединения с сервером
    SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL);//создание сокета, SOCK_STREAM - протокол, который устанавливает соединение
    if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) !=0) {
        cout << "Errror: failed connect to server.\n";
        return 1;
    }//пытаемся соединиться с сервером

    cout << "Connected to server!\n";
    
    system("pause");
    return 0;
}
1

There are 1 answers

3
Remy Lebeau On

In server.cpp, the expression:

if (newConnection == 0)

needs to be this instead:

if (newConnection == INVALID_SOCKET)

accept() does NOT return 0 on failure, as you have coded.

In a 64bit build, the INVALID_SOCKET constant has an unsigned integer value of 18446744073709551615. Which means accept() is failing in your case, but you are not treating it as a failure, which is why you are seeing Client Connected! instead of Error #2.

You need to use WSAGetLastError() to find out WHY a socket function failed, eg:

server.cpp

#include <iostream>//библиотека ввода вывода
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>//библиотека windows для работы с сетью
#pragma warning(disable: 4996)
using namespace std;

int main() {
    //подключили библиотеку
    WSAData wsaData;
    int err = WSAStartup(MAKEWORD(2, 1), &wsaData);
    if (err != 0) {
        cout << "WSAStartup() failed, error " << err << endl;
        return 1;
    }//1-ый параметр запрашиваемая версия библиотеки


    //заполнение информации об адресе сокета
    SOCKADDR_IN addr = {};//название интернет протокола
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("172.2.2.2");//хранит ip адрес 
    addr.sin_port = htons(4321);//порт
    addr.sin_family = AF_INET;//симейство протоколов

    //для установления соединения
    //прослушивание на определенном порту
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);//создание сокета, SOCK_STREAM - протокол, который устанавливает соединение
    if (sListen == INVALID_SOCKET) {
        err = WSAGetLastError();
        cout << "socket() failed, error " << err << endl;
        WSACleanup();
        return 1;
    }

    if (bind(sListen, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR) { //привязываем адрес и порт к сокету, 2-ой параметр - указатель на SOCKADDR_IN adrr, 3-ий - размер SOCKADDR_IN adrr
        err = WSAGetLastError();
        cout << "bind() failed, error " << err << endl;
        closesocket(sListen);
        WSACleanup();
        return 1;
    }

    //прослушивание порта в ожидании соединения со стороны клиента
    if (listen(sListen, SOMAXCONN) == SOCKET_ERROR) { //SOMAXCONN - максимальное число запрос ожидающих обработки
        err = WSAGetLastError();
        cout << "listen() failed, error " << err << endl;
        closesocket(sListen);
        WSACleanup();
        return 1;
    }

    //новый сокет чтобы удерживать соединение с клиентом
    SOCKET newConnection = accept(sListen, (SOCKADDR*)&addr, &sizeofaddr); //accept возвращает указатель на новый сокет. второй параметр будет содержать ip адрес клиента, который произвел подключение
    if (newConnection == INVALID_SOCKET) {
        err = WSAGetLastError();
        cout << "accept() failed, error " << err << endl;
        closesocket(sListen);
        WSACleanup();
        return 1;
    }

    cout << "Client Connected!\n";

    system("pause");

    closesocket(newConnection);
    closesocket(sListen);
    WSACleanup();

    return 0;
}

client.cpp

#include <iostream>//библиотека ввода вывода
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>//библиотека windows для работы с сетью
#pragma warning(disable: 4996)
using namespace std;

int main() {
    //подключили библиотеку
    WSAData wsaData;
    int err = WSAStartup(MAKEWORD(2, 1), &wsaData);
    if (err != 0) {
        cout << "WSAStartup() failed, error " << err << endl;
        return 1;
    }//1-ый параметр запрашиваемая версия библиотеки

    //заполнение информации об адресе сокета
    SOCKADDR_IN addr;//название интернет протокола
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("172.2.2.2");//хранит ip адрес 
    addr.sin_port = htons(4321);//порт
    addr.sin_family = AF_INET;//симейство протоколов

    //создание сокета для соединения с сервером
    SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL);//создание сокета, SOCK_STREAM - протокол, который устанавливает соединение
    if (Connection == INVALID_SOCKET) {
        err = WSAGetLastError();
        cout << "socket() failed, error " << err << endl;
        WSACleanup();
        return 1;
    }

    if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) {
        err = WSAGetLastError();
        cout << "connect() failed, error " << err << endl;
        closesocket(Connection);
        WSACleanup();
        return 1;
    }//пытаемся соединиться с сервером

    cout << "Connected to server!\n";
    
    system("pause");

    closesocket(Connection);
    WSACleanup();

    return 0;
}