Я разрабатываю приложение Qt и испытываю довольно странную проблему с сетью. Позвольте мне показать, как это выглядит с точки зрения конечного пользователя.
Сначала я запускаю свой сервер и проверяю, что он прослушивает целевой порт:
[user@host server]$ sudo netstat -anp | grep 30004
tcp 0 0 0.0.0.0:30004 0.0.0.0:* LISTEN 11113/./server
Затем я подключаюсь к серверу с помощью telnet:
[user@host server]$ telnet localhost 30004
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Netstat показывает, что соединение установлено. Пока ничего интересного:
[user@host server]$ sudo netstat -anp | grep 30004
tcp 0 0 0.0.0.0:30004 0.0.0.0:* LISTEN 11113/./server
tcp 0 0 127.0.0.1:30004 127.0.0.1:34608 ESTABLISHED 11113/./server
tcp 0 0 127.0.0.1:34608 127.0.0.1:30004 ESTABLISHED 12657/telnet
Затем сервер разрывает соединение на основе тайм-аута конкретного приложения. На данный момент установлено значение 10 секунд:
[user@host server]$ sudo netstat -anp | grep 30004
tcp 0 0 0.0.0.0:30004 0.0.0.0:* LISTEN 11113/./server
tcp 0 0 127.0.0.1:30004 127.0.0.1:34608 TIME_WAIT -
Затем я выключаю сервер и проверяю, уничтожен ли прослушивающий сокет:
[user@host server]$ sudo netstat -anp | grep 30004
tcp 0 0 127.0.0.1:30004 127.0.0.1:34608 TIME_WAIT -
Наконец, я снова запускаю сервер, но порт прослушивания больше не отображается:
[user@host server]$ sudo netstat -anp | grep 30004
tcp 0 0 127.0.0.1:30004 127.0.0.1:34608 TIME_WAIT -
В результате клиент не может подключиться к серверу:
[user@host server]$ telnet localhost 30004
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
Что я здесь делаю неправильно? Я склоняюсь к тому, что это проблема конфигурации, а не бага приложения. Этот сценарий, кажется, работает на Ubuntu моего ноутбука. Вышеупомянутый вывод был также произведен на linux box.
ОБНОВЛЕНИЕ: Еще одна вещь, которая отличается в этих двух средах, — это версия qt. У меня на ноуте 4.8.6, на линуксе 4.6.2. Не уверен, что это имеет значение.