Здравствуйте, __boolean, Вы писали:
__>Ну я проверял, если вызвать shutdown и не дожидаться FD_CLOSE, то на удаленной стороне
__>сработает WSAGETSELECTERROR(lParam).
Обычный способ завершения соединения — вызов функции close (closesocket в Windows). При этом данный процесс не может больше использовать дескриптор сокета. Счетчик ссылок на этот дескриптор уменьшается на 1. Если он достигает нуля, то по умолчанию отправляются данные, поставленные в очередь для отправки, и осуществляется завершение соединения. (Поведение функции close можно изменить, воспользовавшись параметром сокета SO_LINGER). Если же он больше нуля, то завершения соединения не происходит.
Функция shutdown позволяет закрыть принимающий/отправляющий/оба конца соединения, несмотря на значение счетчика ссылок.
И еще. При завершении процесса все его открытые дескрипторы закрываются.
Теперь о примере. Что-то не совсем понятно, где что закрывается с помощью shutdown. Подробнее pls.
Если клиент поработал с сервером, и ему (клиенту) от него (сервера) уже ничего не нужно, то вызови close. Если клиент закончил отправку данных, но еще хочет что-то принять, то shutdown для отправляющего конца. Если наоборот — для принимающего.
А вообще, если собрался использовать все преимущества Winsock, то очень рекомендую посмотреть MSDN, как это делают ребята из Майкрософта.