Я могу закрыть и вновь открыть сокет?

Я изучил пример использования сокетов. В этом примере клиент отправляет запрос к серверу для открытия сокета, и затем сервер (слушание определенного порта) открывает сокет, и все прекрасно, сокет "открыт" с обеих сторон (клиент и сервер).

Но мне все еще не ясно, насколько гибкий этот материал. Например, это возможный для клиента закрыть открытый (от обоих концов) сокет и вновь открыть его снова (при условии, что сервер сохраняет сокет открытым).

Для сервера действительно ли возможно "знать", что сокет был закрыт на стороне клиента? Для клиента действительно ли возможно знать, что сокет был закрыт на стороне сервера?

ДОБАВЛЕННЫЙ:

Еще одна важная вещь мне. Что происходит если приложение (никакой сервер матери или клиент) катастрофические отказы, неправильно завершенные, уничтоженные? Это закроет все сокеты, открытые на стороне приложения?

ДОБАВЛЕННЫЙ 2:

Что, если приложение на одной стороне сокета выключено (уничтоженный, закрытый, завершенный) и затем это включается снова (на том же IP-адресе и том же порте). Если мы создаем новый сокет между этими двумя приложениями, или мы можем использовать старый сокет (созданный перед катастрофическим отказом).

6
задан tshepang 22 April 2014 в 22:45
поделиться

2 ответа

Может ли сервер "знать", что сокет был закрыт на стороне клиента?

Когда сервер пытается отправить некоторые данные этому клиенту, возникает соответствующее исключение. быть брошенным.

Еще одна важная вещь для меня. Что произойдет, если приложение (ни сервер , ни клиент) выйдет из строя, аварийно завершится, завершится? Закроет ли он все сокеты , открытые на стороне приложения ?

Создаются исключения для обработки этих ненормальных случаев. Если происходит затемнение и клиент (или сервер) выключен, то другая сторона получит исключение, как только попытается взаимодействовать с выключенной стороной.

UPD:

Что делать, если приложение на одной стороне сокета выключено (убито, закрыто, завершено), а затем снова включено (на том же IP-адресе и том же порту). Должны ли мы создать новый сокет между двумя приложениями или мы можем использовать старый сокет (созданный до сбоя).

Создать новый сокет.

2
ответ дан 8 December 2019 в 18:34
поделиться

Сокет может использоваться для множества вещей, ответы на которые могут измениться, но я предполагаю, что вы говорите о TCP.

Например, может ли клиент закрыть открытый (с обоих концов) сокет и снова открыть его (при условии, что сервер держит сокет открытым).

Нет, потому что TCP выполнит прощание, и вы не сможете снова установить соединение. Вам придется снова выполнить трехстороннее рукопожатие, и это запустит новое соединение.

Может ли сервер «знать», что сокет был закрыт на стороне клиента? Может ли клиент узнать, что сокет был закрыт на стороне сервера?

Да . TCP может отправить прощальный пакет, или у одной стороны может истечь время ожидания, и вполне возможно обнаружить эти сценарии в обоих случаях.

9
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: