|
#1
|
||||
|
||||
Ошибка select
Пример:
Код:
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'а - вполне себе сокет? jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.02.2015 в 00:36. |
#2
|
||||
|
||||
Для селекта вроде надо +1 делать от хэндла сокета.
Код:
select(sock+1 — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Это в линухах надо, а в винде - нет:
Цитата:
В общем переделал на WSAEventSelect + WaitForSingleObject, и все стало нормально. В топку линкусовые селекты. jmp $ ; Happy End! The Cake Is A Lie. |