Здравствуйте NavuhodonosoR, Вы писали:
C>>>Такой проблем: есть клиент и сервер. На клиенте открывается окошко куда ждут ввод, но если связь с сервером обрывается это окошко надо закрыть. Для проверки наличия связи на клиенте вызываю recv.
G>>Проверить сокет на возможность записи в него данных можно с помощью функции select (см. аргумент writefds)
C>>>И если получается ошибка, окошко закрываем.
NR>Неправильно. Сокет закрыт <=> recv возвращает 0.
Кто бы спорил!

Только вот, в таком случае по сокету гоняются левые, никому не нужные (в данной постановке), данные. Потому как если recv не вернул 0 и не вернул SOCKET_ERROR, то он должен вернуть количество принятых байт, а их для этого надо послать. Делать это только для проверки "живости" сокета, я считаю, лишне.
G>>Но это вообщем-то не важно. Проблема видимо в твоей проверке recv-ом и в том, что у recv-а есть таймаут на получение данных. Видимо, пока этот таймаут не проходит — клиент висит. Так что select.
NR>Не пойдет. select через readfds скажет, что из сокета можно прочитать либо что сокет закрыт. При этом для проверки "закрыт ли сокет?" по любому придется вызывать recv.
При чем тут readfds? Я говорил про writefds. В клиент-серверных отношениях рулит клиент, а сервер выполняет пассивную роль. С этой точки зрения "живость" сокета должна проверяться клиентом, и именно на возможность записи в него (в сокет), т.е. проверка способности клиента рулить.
А вообще, это дело вкуса