Могу ли я закрыть и снова открыть сокет? - PullRequest
6 голосов
/ 16 марта 2010

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

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

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

ДОБАВЛЕНО:

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

ДОБАВЛЕНО 2:

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

Ответы [ 3 ]

9 голосов
/ 16 марта 2010

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

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

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

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

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

2 голосов
/ 03 июня 2011

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

A1 -> Сервер будет знать, закрывает ли клиент сокет, и наоборот.Фактически FIN будет отправлен с конца, который инициирует закрытие соединения.

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

A2-> Если сокет создан, номер fd связывается с ip-addr & port, поэтому сокет на стороне сервера имеет server-ip и некоторый порт, а сокет на стороне клиента имеет client-ip & some port.если на клиенте произошел сбой, все fd освобождаются и их нельзя использовать повторно. Если мы используем тот же fd, система будет рассматривать его как обычный файл fd.

2 голосов
/ 16 марта 2010

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

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

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

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

UPD:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...