Я пишу сервер с помощью Microsoft MSDN...
Он отлично работает с моим клиентом, подключается и все, но когда я добавляю -
#include <thread>
просто эта строка для моего проекта, это заставляет сервер перестать работать (всегда получает недопустимый сокет при привязке/прослушивании)...
это мой код:
SOCKET Connect_To_Client()
{
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
int count = 0;
while (iResult != NO_ERROR)
{
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
count++;
if (count == 3)
{
MessageBox(NULL, "WSA Startup failed!", "ERROR", MB_OK);
return -1;
}
}
// Create a SOCKET for listening for incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
count = 0;
while (ListenSocket == INVALID_SOCKET)
{
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
count++;
if (count == 3)
{
MessageBox(NULL, "Error in Listening Socket!", "ERROR", MB_OK);
closesocket(ListenSocket);
WSACleanup();
return -1;
}
}
//ADDR
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(DEFAULT_IP);
service.sin_port = htons(DEFAULT_PORT);
count = 0;
bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
// Listen for incoming connection requests on the created socket
count = 0;
cout << "Listening..." << endl;
while (listen(ListenSocket, 1) == SOCKET_ERROR)
{
count++;
if (count == 3)
{
MessageBox(NULL, "Error listening!", "ERROR", MB_OK);
closesocket(ListenSocket);
WSACleanup();
return -1;
}
}
SOCKET AcceptSocket; // Create a SOCKET for accepting incoming requests.
// Accept the connection.
AcceptSocket = accept(ListenSocket, NULL, NULL);
count = 0;
while(AcceptSocket == INVALID_SOCKET)
{
AcceptSocket = accept(ListenSocket, NULL, NULL);
count++;
if (count == 3)
{
MessageBox(NULL, "Error Connecting", "ERROR", MB_OK);
closesocket(ListenSocket);
WSACleanup();
return -1;
}
}
cout << "Connected!" << endl;
return AcceptSocket;
}
Если у меня есть #include <thread>
он не работает (недействительный сокет), и если я не уверен, он отлично работает. Что я сделал неправильно?
Благодарю!
В <thread>
нет ничего, что могло бы повлиять на API winsock. Но на всякий случай вам нужно либо предварительно скомпоновать свой код, либо посмотреть на вывод прекомпилятора, либо просто пропустить код с помощью отладчика и убедиться, что все ваши переменные и параметры функции имеют правильные значения, которые вы ожидаете.
<thread>
и посмотреть, отличается ли что-либо, либо 2) отладить код во время выполнения и посмотреть, что на самом деле происходит при каждом вызове функции. Поскольку ваш код в настоящее время стоит, <thread>
не должен влиять на него, что говорит о том, что <thread>
определяет что-то неожиданное, например, с помощью #define
который использует то же имя, что и то, что вы используете.
я верю
#include <winsock2.h>
требуется для сокетов.
#include <thread>
используется для поддержки новых потоков в С++ 11, и я считаю, что он поддерживается только в VC13 или, возможно, в VC12.