Проблема с многопоточностью WinSock
От: proc321  
Дата: 19.01.10 00:02
Оценка:
Добрый день,

На данный момент имею программу, которая принимает входящие соединения от клиентов (TCP), создавая для обработки каждого клиента отдельный поток.
Переделал программу, реализовав пул соединений.
Выглядит это примерно так:


DWORD __stdcall PoolProcessThread(PVOID unused) {

unsigned uDataCount;
...
while (true) {

// проверка наличия данных в recv-буфере
if (ioctlsocket(Sock, FIONREAD, (u_long *)&uDataCount) == SOCKET_ERROR) {

// ошибка

}

...
}

return (0);
}



В основном потоке:


HANDLE hThread = CreateThread(0, 0, PoolProcessThread, 0, 0, 0);

while (true) {
ClientSock = SOCKET_ERROR;
while (ClientSock == SOCKET_ERROR) {

    // принимаем соединение
    ClientSock = accept(Sock, (sockaddr *)&sa, &len_sa);
}

// добавляем во временный пул
AddClient(Sock);
}


Проблема в том, что при вышеизложенном подходе функция ioctlsocket всегда возвращает SOCKET_ERROR (ошибка WSAENOTSOCK).
Подозреваю, что это связано с тем, что сокет создается в одном потоке, а используется в другом.
До перехода на пул подключений — сокет также создавался в одном потоке, а использовался в другом и проблем не было.
Все остальные функции winsock — recv, send также не работают.
В чем может быть проблема на ваш взгляд?
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.