![]() |
|
|
#1
|
||||
|
||||
|
Пример:
Код:
sock = accept(sc, NULL, NULL);
u_long mode = 1;
ioctlsocket(sock, FIONBIO, &mode);
sleep(1000);
size = recv(sock, ...);Код:
sock = accept(sc, NULL, NULL);
u_long mode = 1;
ioctlsocket(sock, FIONBIO, &mode);
timeval t = { 0, 0 };
fd_set read_fd;
FD_ZERO(&read_fd);
FD_SET(sock, &read_fd);
if (select(0, &read_fd, 0, 0, &t) == SOCKET_ERROR)
{
ec = WSAGetLastError();
return;
}
size = recv(sock, ...);Еще один финт ушами: не делаем return. И данные успешно приходят. Что происходит? Почему sock - "не сокет" для select'а, но для recv'а и ioctlsocket'а - вполне себе сокет? Последний раз редактировалось Bargest, 07.02.2015 в 00:36. |
|
#2
|
||||
|
||||
|
Для селекта вроде надо +1 делать от хэндла сокета.
Код:
select(sock+1 |
|
#3
|
||||
|
||||
|
Это в линухах надо, а в винде - нет:
Цитата:
В общем переделал на WSAEventSelect + WaitForSingleObject, и все стало нормально. В топку линкусовые селекты. |