Для тех, кто не хочет читать длинный вопрос, вот короткая версия:
На сервере есть открытый сокет для клиента.Сервер получает запрос на открытие сокета с того же IP-адреса клиента и клиентского порта.Я хочу, чтобы сервер не отклонял такой запрос, а закрывал старый сокет и открывал новый.Как я могу сделать это?
А вот длинный (оригинальный) вопрос:
У меня следующая ситуация.Существует установленная связь между сервером и клиентом.Затем внешнее программное обеспечение (Bonjour) сообщает моему клиенту, что оно не видит сервер в локальной сети.Что ж, клиент ничего не делает с этим по следующим причинам:
Если Bonjour не видит сервер, это не обязательно означает, что клиент не может видеть сервер.
Даже если клиент доверяет Bonjour и закрывает сокет, это не улучшает ситуацию («не иметь открытого сокета» хуже, чем «иметь потенциально плохой сокет»).
Итак, клиент ничего не делает, если сервер становится невидимым для Bonjour.Но затем сервер снова появляется в Bonjour, и Bonjour уведомляет об этом клиента.В этой ситуации возможны следующие ситуации:
Сервер вновь появляется с новым IP-адресом.Таким образом, клиент должен открыть новый сокет, чтобы иметь возможность связаться с сервером.
Сервер вновь появляется на старом IP-адресе.В этом случае у нас есть два случая:
2.1.Сервер был перезапущен (выключен, а затем включен).Таким образом, он не запоминает старый сокет (который все еще используется клиентом).Таким образом, клиент должен закрыть старый сокет и открыть новый (на тот же IP-адрес сервера и тот же порт сервера).
2.2.У нас была временная проблема с сетью, и сервер работал все время.Итак, старый сокет все еще доступен для использования.В этом случае клиенту на самом деле не нужно закрывать старый сокет и заново открывать новый.
Но чтобы упростить свою жизнь, я в любом случае решил закрыть и снова открыть сокет на стороне клиента (несмотря натот факт, что это не очень нужно в последней описанной ситуации).
Но у меня могут быть проблемы с этим решением.Если я закрою сокет на стороне клиента и попытаюсь снова открыть сокет с того же IP-адреса клиента и клиентского порта, сервер не примет вызов для нового сокета.Сервер будет думать, что такой сокет уже существует.
Можно ли написать сервер таким образом, чтобы он не отказывался от таких вызовов.Например, если он (сервер) видит, что клиент отправляет запрос на сокет с того же IP-адреса клиента и клиентского порта, он (сервер) закрывает доступный сокет, связанный с этим клиентским IP-адресом и клиентским портом, ичем он открывает новую розетку.