Как узнать что неблокирующий сокет с другой стороны был закрыт сервером ?? (при условии что его закрыли правильно через shutdown) ????
у меня похожая проблема http://www.wasm.ru/forum/index.php?action=vthread&forum=12&topic=11871 теоретически должно придти сообщение FD_CLOSE если используется WSAAsyncSelect() или recv() вернет 0 при ближайшем вызове.
используй recv, придет уведомление, а в результате функции будет 0. но если сокет с другой стороны ничего не пришлет, то recv не закончится никогда. Лучше всего использовать событийную модель, если ждешь уведомленя о событии на сокете.
>> неблокирующий сокет с другой стороны был закрыт recv вернет что-нибудь сразу в любом случае если сокет неблокирующий. 0 если соединение закрыто или SOCKET_ERROR если нет данных (GetLastError() будет WSAEWOULDBLOCK)
kropalik Слышал что это не лучший способ мол эта фигня на окнах как-то там неудачно реализована и работает не оч быстро... Он то вернет .. но он неблокирующий ведь .. там ноль может значить что он просто ниче не принял потому что пока не смог kropalik т.е. он на Select выставится в список ошибленых если пакеты недошли? GetLastError() всегда мну 0 возвращает .... на Select ошибленых сокетов не вставляется
Правильно говорят. recv() вернёт 0, если сервер закрыл сокет (точнее, если придёт FIN) или -1, если сервер упал (точнее, если придёт RST). А как убедиться, что это именно закрыт сокет, а не ноль данных? Всё просто. Код (Text): select(maxfd+1, &rset, ..., ..., ...); if (FD_ISSET(sockfd, &rset)) { /* в сокет пришли данные, можно читать */ int count = read(sockfd, ..., ...); if (count == 0) /* сервер выполнил shutdown(), можно сокет закрывать */ if (count == -1) /* сервер упал, сокет, вообщем, тоже больше не нужен */ if (count > 0) /* в буфере лежит count прочитанных байт */ См. Стивенса, "Unix Network Porgramming", vol. 1, section 6.4
Bert Вот делал я так подобно ... код старый - ща вдумался - там бред написан гы.. .зафиксил как ты сказал - все работает и все замечательно!! спасибо!