Добрый день,
На данный момент имею программу, которая принимает входящие соединения от клиентов (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 также не работают.
В чем может быть проблема на ваш взгляд?
Спасибо.