Re: Проблема с многопоточностью WinSock
От: ioni Россия  
Дата: 19.01.10 06:35
Оценка: +2
Здравствуйте, 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);
}


а ты тот сокет сохраняешь?
Re: Проблема с многопоточностью WinSock
От: BigBoss  
Дата: 19.01.10 20:35
Оценка: +1
Здравствуйте, proc321, Вы писали:

P>Добрый день,


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

P>Переделал программу, реализовав пул соединений.

Вроде этот велосипед в boost::asio уже изобрели. Чем плох?
Проблема с многопоточностью 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...
Пока на собственное сообщение не было ответов, его можно удалить.