2016-09-30 4 views
0

Мы используем Linux 2.6.33 на устройстве. Будет использоваться приложение для ПК, которое подключается к устройству через сокет TCP. На запрос из приложения будет передано не более 1 МБ данных.Как быстро закрыть TCP-сокет и снова подключиться

Рассмотрите, если приложение подключено и работает нормально и между IP-адресом устройства будет изменено (что возможно с помощью команды). Теперь соединение прерывается в приложении, но на устройстве его нет. Но пользователь надеется подключиться к устройству с новым IP-адресом. В некоторых случаях «send()» был на полпути и, возможно, не отправлял все данные, тогда это закрытие не происходит немедленно, и, следовательно, пользователь не сможет подключиться, пока гнездо не будет закрыто на устройстве.

Я использую «выключение (носок, RDWR), закрыть (носок)» последовательность в Netstat выходных показывает:.

$ netstat -nt 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
tcp  0 29200 xx.xx.xx.xx:3000  xx.xx.xx.xx:50639  ESTABLISHED 

Как показывает Send-Q еще не пуст, и поэтому соединение все еще находится в ESTABLISED состояния этого. сокет закрывается через некоторое время, и я не уверен, сколько времени это возможно. Может определяться реализацией сокета.

Как я могу закрыть t его сокет немедленно, чтобы можно было установить новое соединение через тот же TCP-порт из приложения ПК?

+0

Это определяется временем, которое требуется для завершения ожидающих отправлений или отмены их, если они не подтверждаются. Я не понимаю, что «пользователь надеется подключиться к устройству с новым IP-адресом». Почему новый IP-адрес? – EJP

+0

Поскольку IP-адрес Ethernet изменяется с помощью команды пользователя. Теперь пользователю необходимо снова запустить приложение с новым IP-адресом сразу после изменения IP-адреса. –

+0

Как узнать время, необходимое для закрытия этого потерянного сокета, отбросив ожидающие пакеты отправки-Q? –

ответ

0

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

0

Как я могу закрыть этот разъем сразу, чтобы новое соединение через было возможным из того же TCP-порта из приложения ПК?

Вы можете закрыть его по телефону близко(), конечно, но то, что вы действительно хотите знать, как обнаружить это условие, так что вы знаете, когда называют близко(). Ответ на этот вопрос: нелегко - насколько это касается вашего устройства Linux, клиент в папке (the_old_ip_address) просто перестает отвечать. Устройство Linux не имеет никакого представления о том, что это условие связано с изменением IP-адреса клиента, а не (скажем) временным отключением сети, поэтому устройство Linux будет пытаться в течение нескольких минут, прежде чем оно истечет.

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

При этом другой подход заключается в том, чтобы добавить тайм-ауты на ваш сервер таким образом, чтобы, если никакие данные не были отправлены или получены в сокет TCP в течение N секунд (для любого значения N, которое, по вашему мнению, является подходящим), сервер затем явно вызывает close() в сокете и прослушивает новое входящее соединение. Однако это не очень хорошее решение, поскольку оно делает предположение о производительности TCP-соединения (т. Е. Когда в своем «рабочем» состоянии его всегда будут отправлять или получать данные не реже одного раза в N секунд) и это предположение может быть неверным, т. е. если ваш клиент и сервер не хотят ничего посылать на какое-то время или если сетевое подключение плохое, чтобы данные не проходили более чем на N секунд. Риск состоит в том, что это приведет к ложноположительному, в результате ваш сервер закроет TCP-соединение, которое все еще действует. Поэтому я рекомендую, по возможности, первый подход, а не этот.

Смежные вопросы