включая прерывания потоков, прослушивание через сокеты

0

Я пишу сервер с помощью 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> он не работает (недействительный сокет), и если я не уверен, он отлично работает. Что я сделал неправильно?

Благодарю!

  • 0
    Вы должны переместить вызов WSAStartup () в другое место, чтобы это происходило только один раз. И если это не удастся, нет смысла повторять это.
Теги:
multithreading
sockets

2 ответа

1
Лучший ответ

В <thread> нет ничего, что могло бы повлиять на API winsock. Но на всякий случай вам нужно либо предварительно скомпоновать свой код, либо посмотреть на вывод прекомпилятора, либо просто пропустить код с помощью отладчика и убедиться, что все ваши переменные и параметры функции имеют правильные значения, которые вы ожидаете.

  • 0
    Почему происходит другое, если при удалении строки все значения верны (ВСЕГДА), а при добавлении строки - нет?
  • 1
    Как я уже сказал, вам нужно либо: 1) предварительно скомпилировать код с присутствующим и без <thread> и посмотреть, отличается ли что-либо, либо 2) отладить код во время выполнения и посмотреть, что на самом деле происходит при каждом вызове функции. Поскольку ваш код в настоящее время стоит, <thread> не должен влиять на него, что говорит о том, что <thread> определяет что-то неожиданное, например, с помощью #define который использует то же имя, что и то, что вы используете.
Показать ещё 2 комментария
0

я верю

#include <winsock2.h>

требуется для сокетов.

#include <thread>

используется для поддержки новых потоков в С++ 11, и я считаю, что он поддерживается только в VC13 или, возможно, в VC12.

  • 0
    Я использую Microsoft Visual Studio 2012, и я всегда использовал `#include <thread>` раньше, но не с сокетами в том же проекте ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню