Вот, читаем MSDN:
For connection-oriented sockets, readability can also indicate that a request to close the socket has been received from the peer. If the virtual circuit was closed gracefully, and all data was received, then a recv will return immediately with zero bytes read. If the virtual circuit was reset, then a recv will complete immediately with an error code such as WSAECONNRESET.
Итак — select при закрытии сокета почти бесполезен и вернет то, что есть данные на входе. И только чтением потом мы выясним, что собственно, канала уже нет. Очевидно, код ошибки получаем WSAGetLastError или просто GetLastError.
Это собственно, не супротив постинга, а так, для ясности
Здравствуйте Smart, Вы писали:
S>Здравствуйте Corvin, Вы писали:
C>>Такой проблем: есть клиент и сервер...<CRLF>
S>.<CRLF>
S>-)
S>1: recv() для SOCK_STREAM в случае закрытия сокета возвращает 0 или SOCKET_ERROR.
S>2: не забудьте в select() (если вы вообще используете эту функцию) указать группу сокетов для чтения (у сомого такая фигня была, часа 2 копался, а всё было так просто.
S>3: не используйте примочки Windows Sockets. Лучше уж старые Berkeley-совместимые (хоть и не полностью), но проверенные функции.
S>4: если вы храните дескриптор сокета в какой-нибудь динамической структуре данных, то проследите за тем, чтобы на стадии закрытия дескриптор всё-таки существовал (не удаляйте объект раньше времени).
S>5: у меня какой-то баг с STLport при посылке тескта сообщения (берётся из файла и на экран выводится вроде правильно, со всеми служебными символами, а Outlook Express продолжает ждать после приёма <CRLF>.<CRLF>
), а под Dinkumware STL (VC60SP5) всё нормально.