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。不知道它是否重要。
当您尝试绑定/侦听/接受您的服务器套接字时,您的代码报告出现什么错误?如果您在服务器套接字上设置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
@nos, 我正在使用QTcpServer,我可以看到的是对listen方法的调用返回false。 如何为QTcpServer启用此选项? Afaik QTcpServer自动设置此选项。 没有,没有: [user @ host server] $ sudo netstat -anp | grep服务器 活动Internet连接(服务器和已建立) 活动UNIX域套接字(服务器和已建立) – krakovjak 2014-09-25 13:25:27
它似乎是* nix上的默认设置。因此,如果listen()返回false,则调用QAbstractSocket :: SocketError并查看它说的是什么。无论如何你应该发布你的代码。 – nos 2014-09-25 13:35:28