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