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;
}
In
server.cpp, the expression:if (newConnection == 0)needs to be this instead:
if (newConnection == INVALID_SOCKET)accept()does NOT return0on failure, as you have coded.In a 64bit build, the
INVALID_SOCKETconstant has an unsigned integer value of18446744073709551615. Which meansaccept()is failing in your case, but you are not treating it as a failure, which is why you are seeingClient Connected!instead ofError #2.You need to use
WSAGetLastError()to find out WHY a socket function failed, eg:server.cpp
client.cpp