QTcpSocket无法进入ConnectedState,向高手求救

dreadknight5 2010-07-12 08:27:57
我的socket客户端是用QTcpSocket类实现的。必须能够运行接收connected信号的槽里的程序。
QTcpSocket在主线程里运行。
发现执行 ConnectToHost 以后,无法进入 Connected。连127.0.0.1或局域网内的服务器就只进入到ConnectingState,连接Internet上的服务器就只能进到 HostLookupState。connected、disconnected、error信号都证实没被emit。
请问问题出在哪里?该如何解决?
...全文
1300 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lone-X 2010-12-20
  • 打赏
  • 举报
回复
谢谢大家分享经验,帮我解决了问题!
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
我服务器端用过 sockettools2 和 TCP-UDP服务管理,结果都是这样
windows防火墙关闭了
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
奇怪的是虽然没进入 ConnectedState,但服务器确实能收到 QTcpSocket 通过write发送的数据
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
write之后waitForBytesWritten()
再次更换服务器程序
搞定了

感激不尽!

sockettools2 和 TCP-UDP服务管理 两个都有问题
前者修改程序后收不到数据,后者接收不到发往127.0.0.1的数据。
我是用了后者,然后目标IP填写网卡上设置的ip才行的
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
原来是服务器的问题
现在换了服务器软件,能进入ConnectedState了
但是write进去的数据收不到
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
还是不行啊

cout << m_Socket.state() << endl;
m_Socket.waitForConnected();
cout << m_Socket.state() << endl;

第一行输出2,第2行输出0
lefttime 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dreadknight5 的回复:]

最简单的代码就几句。看看问题出在哪里?
信号和槽都移除了:

void MainWindow::Test()
{
cout <<"Testing" <<endl;
QTcpSocket m_Socket;
m_Socket.connectToHost("127.0.0.1" , 1234);
m_Socket.write("OK"); //服务器收……
[/Quote]
从这程序看, 当前连接还没建立就已经直接下命令发送数据, 并打印状态, 固然输出的Socket状态是ConnectingState, 表明它还在连接中~``

Socket的连接是异步的, 如果你想建立正确的连接, 你应该等待它完成连接~` 举个例子:

...
QTcpSocket m_Socket;
m_Socket.connectToHost("127.0.0.1" , 1234);

cout << m_Socket.state() << endl;

m_Socket.waitForConnected();

cout << m_Socket.state() << endl;

if(m_Socket.state() == QTcpSocket::Connected)
{
// 这里可以进行连接后的操作

m_Socket.abort();

cout << m_Socket.state() << endl;
}

...
dreadknight5 2010-07-13
  • 打赏
  • 举报
回复
最简单的代码就几句。看看问题出在哪里?
信号和槽都移除了:

void MainWindow::Test()
{
cout <<"Testing" <<endl;
QTcpSocket m_Socket;
m_Socket.connectToHost("127.0.0.1" , 1234);
m_Socket.write("OK"); //服务器收不到。但我原来按这种思路写的程序服务器居然收到了
cout <<"state:"<<m_Socket.state()<<endl; //输出:state:2 (2代表ConnectingState。正确的结果应该是3,即ConnectedState
}

lefttime 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dreadknight5 的回复:]

奇怪的是虽然没进入 ConnectedState,但服务器确实能收到 QTcpSocket 通过write发送的数据
[/Quote]

这种情况一般是不可能发生的吧, 因为还未建立连接就可以进行数据通信, 这已经违背了TCP协议!
lefttime 2010-07-12
  • 打赏
  • 举报
回复
这种情况一般是你的服务器对应的端口没开启, 或者受限于防火墙~``
一般本机或局域网服务器, 只要启动了QTcpServer指定端口或安装一些服务端Ftp、IIS等, 都可以正常连接! 只进入ConnectingState状态,表明端口访问受限而你设置的超时值过长导致!
对于Internet上的服务器同样的道理, 如果该服务器允许Socket连接, 只要知道该端口号一般都能进入到Connected状态~``

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧