Сокет прослушивания TCP не создан

Я разрабатываю приложение 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. Не уверен, что это имеет значение.


person krakovjak    schedule 25.09.2014    source источник
comment
О какой ошибке сообщает ваш код, когда вы пытаетесь связать/прослушать/принять сокет вашего сервера? Есть ли разница, если вы установите параметр сокета SO_REUSEADDR в сокете вашего сервера (так же, как при использовании QAbstractSocket::ShareAddress в качестве BindMode, если вы используете сокеты Qt)? Ваш сервер что-нибудь прослушивает (запустите netstat -apn |grep server)   -  person nos    schedule 25.09.2014
comment
@nos, я использую QTcpServer, и все, что я вижу, это то, что вызов метода listen возвращает false. Как я могу включить эту опцию для QTcpServer? Afaik QTcpServer устанавливает этот параметр автоматически. Нет, ничего: [пользователь@хост-сервер]$ sudo netstat -anp | сервер grep Активные подключения к Интернету (серверы и установленные) Активные сокеты домена UNIX (серверы и установленные)   -  person krakovjak    schedule 25.09.2014
comment
Кажется, это по умолчанию на * nix. Итак, если listen() возвращает false, вызовите QAbstractSocket::SocketError и посмотрите, что он говорит. Вы, вероятно, все равно должны опубликовать свой код.   -  person nos    schedule 25.09.2014
comment
Спасибо, он сообщает 8, то есть QAbstractSocket::AddressInUseError...   -  person krakovjak    schedule 25.09.2014
comment
Как возможно, что QTcpServer::listen выдает AddressInUseError, хотя устанавливает параметр SO_REUSEADDR?   -  person krakovjak    schedule 26.09.2014


Ответы (1)


По-видимому, возникла проблема с версиями библиотек qt. Мы обновили его до последней версии 4.x.x, и теперь проблема, кажется, решена.

person krakovjak    schedule 26.09.2014