2014-09-25 140 views
1

我正在开发一个Qt应用程序并且体验相当奇怪的网络问题。 让我从最终用户的角度展示它的外观。TCP侦听套接字未被创建

首先,我开始了我的服务器,并验证它监听的目标端口:

[[email protected] server]$ sudo netstat -anp | grep 30004 
    tcp  0  0 0.0.0.0:30004    0.0.0.0:*     LISTEN  11113/./server 

然后我连接到服务器通过telnet:

[[email protected] 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显示连接正在建立。目前为止没什么特别的:

[[email protected] 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秒的时刻:

[[email protected] 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 -     

我则关闭服务器,并验证一边收听插座被破坏:

[[email protected] server]$ sudo netstat -anp | grep 30004 
tcp  0  0 127.0.0.1:30004    127.0.0.1:34608    TIME_WAIT -     

最后我再次启动服务器,但监听端口不会再露面:

[[email protected] server]$ sudo netstat -anp | grep 30004 
tcp  0  0 127.0.0.1:30004    127.0.0.1:34608    TIME_WAIT -     

因此客户端无法连接到服务器:

[[email protected] 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机器上生成的。

更新:在这两个environemnt不同的另一件事是qt版本。在我的笔记本电脑上,我有4.8.6,在Linux上它是4.6.2。不知道它是否重要。

+0

当您尝试绑定/侦听/接受您的服务器套接字时,您的代码报告出现什么错误?如果您在服务器套接字上设置SO_REUSEADDR套接字选项(与使用[QAbstractSocket :: ShareAddress](http://qt-project.org/doc/qt-5/QAbstractSocket.html)作为BindMode,那么是否有区别)你正在使用Qt套接字)?你的服务器监听任何东西(运行netstat -apn | grep服务器) – nos 2014-09-25 13:17:25

+0

@nos, 我正在使用QTcpServer,我可以看到的是对listen方法的调用返回false。 如何为QTcpServer启用此选项? Afaik QTcpServer自动设置此选项。 没有,没有: [user @ host server] $ sudo netstat -anp | grep服务器 活动Internet连接(服务器和已建立) 活动UNIX域套接字(服务器和已建立) – krakovjak 2014-09-25 13:25:27

+0

它似乎是* nix上的默认设置。因此,如果listen()返回false,则调用QAbstractSocket :: SocketError并查看它说的是什么。无论如何你应该发布你的代码。 – nos 2014-09-25 13:35:28

回答

0

显然qt库的版本存在问题。我们将其升级到最新的4.x.x,现在问题似乎得到解决。