Image

Imageex_andrey_t wrote in Imageru_cpp

Category:

Сокеты

Пишу простое клиент-серверное приложение.
И возникло два вопроса по сокетам.

1) Сервер уже отлажен и работает довольно стабильно. Завершаю работу над клиентом. И вот что заметил - если при уже установленном соединении клиент еще раз тыкает на кнопку connect, то соответственно происходит конфликт адресов в функции bind(), т.к. система не может два раза привязывать сокет к одному порту, и на этот случай у меня при аварийном завершении ф-ции bind() закрывается сокет вызовом closesocket(). Т.е. казалось бы при повторном нажатии мы должны успешно привязаться к своему порту, соединиться с сервером и продолжить свою работу. Но этого не происходит. Я смотрел состояние процесса программой ProcessExplorer - она показывает, что соединение существует даже после ошибки в bind() и находится в состоянии ESTABLISHED, и это соединение никак нельзя прибить со стороны клиента - проверял дебаггером - выполнение доходит до ф-ции closesocket(), выполняет ее, а соединение все равно ESTABLISHED.
Конечно сейчас я сменил немного логику приложения и теперь нельзя при установленном соединении еще раз пытаться его установить.
Но все же хочу на будущее знать, почему при повторном вызове bind() соединение уже нельзя прибить?

2) Когда соединение между клиентом и сервером установлено, но сервер вдруг завершает свою работу. То соединение переходит в состояние CLOSE_WAIT(это я узнал из того же ПроцессЭксплорера). Вопрос в том, как узнать тоже самое из моего приложения? Т.е. как узнать состояние соединения, иначе придется для проверки соединения устраивать пинг-понг для сервера с клиентом.

P.S. пишу под Win32, пользуюсь сокетами Windows Sockets 2