Qtcpsocket The remote host closed the connection 问题

sdu_hanson 2014-06-26 03:39:28
C/S程序,tcp连接。

本来都是用winsock写的。

server端对我来说是黑盒的,
现在想把客户端改成用qt实现(qtcpsocket)。

现在的问题是,连接能够连接上,
但是下面代码
if(!SendDataToEC(&head,sizeof(HEAD)))
{
return buf;
}
socket->waitForBytesWritten();


走到红色代码行的时候就会触发error信号,提示信息是The remote host closed the connection 。

由于server端是黑盒的。我自己又用winsock写了一个简单的tcpserver端程序。
然后分别用用qt写的和winsock 写的client程序连接,发现接收到的数据结构是一模一样的,从而排除了数据上的问题。

大家觉得还有可能是什么问题?
...全文
1495 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
foruok 2014-06-27
  • 打赏
  • 举报
回复
引用 5 楼 sdu_hanson 的回复:
[quote=引用 4 楼 foruok 的回复:] 我觉得 QTcpSocket 最好是都是用异步操作,不要使用 waitFor 之类的函数,如果想快点把缓冲区的数据发出去,可以调用 flush 。 bytesWritten 看 Qt 的文档和源码,都是有发送这个信号的哦。 如果你写的数据量很小,要小心系统会缓存着一直不发送,可以设置 TCP_NODELAY 的socket选项。
确实是,不用waitforXXX的话,就不会出错,真奇怪了。不知道有没有官方的解释。 谢谢了哥们[/quote] 其实是因为这个 waitForXXX 的实现是一个循环,会阻塞住 Qt 的事件循环,所以可能会出现莫名其妙的问题,你可以去看 qabstractsocket.cpp 。
sdu_hanson 2014-06-27
  • 打赏
  • 举报
回复
引用 4 楼 foruok 的回复:
我觉得 QTcpSocket 最好是都是用异步操作,不要使用 waitFor 之类的函数,如果想快点把缓冲区的数据发出去,可以调用 flush 。 bytesWritten 看 Qt 的文档和源码,都是有发送这个信号的哦。 如果你写的数据量很小,要小心系统会缓存着一直不发送,可以设置 TCP_NODELAY 的socket选项。
确实是,不用waitforXXX的话,就不会出错,真奇怪了。不知道有没有官方的解释。 谢谢了哥们
foruok 2014-06-26
  • 打赏
  • 举报
回复
我觉得 QTcpSocket 最好是都是用异步操作,不要使用 waitFor 之类的函数,如果想快点把缓冲区的数据发出去,可以调用 flush 。 bytesWritten 看 Qt 的文档和源码,都是有发送这个信号的哦。 如果你写的数据量很小,要小心系统会缓存着一直不发送,可以设置 TCP_NODELAY 的socket选项。
sdu_hanson 2014-06-26
  • 打赏
  • 举报
回复
引用 1 楼 foruok 的回复:
不要调用红色代码。Qt 的socket 被设置成了异步,这种 waitForxxxx 函数容易出问题,如果你想知道数据有没有写入,可以连接 bytesWritten 信号。 另外 QTcpSocket 内部有自己的缓冲区,你调用 write() 时只要判断返回值是否等于要写入的数据量即可,如果不等,你需要把数据缓存起来下次再发送。
waitForXXXX为什么容易出错呢。 还有,如果我不调用这个,不会触发byteswritten槽函数,这个是为什么?
foruok 2014-06-26
  • 打赏
  • 举报
回复
另外我分析是 waitForWritten 结束时数据对端已经发过来了,你需要连接 readyRead() 来接收数据。还有出现error时,你依然可以通过 bytesAvailable() 看看是否数据已经来了。
foruok 2014-06-26
  • 打赏
  • 举报
回复
不要调用红色代码。Qt 的socket 被设置成了异步,这种 waitForxxxx 函数容易出问题,如果你想知道数据有没有写入,可以连接 bytesWritten 信号。 另外 QTcpSocket 内部有自己的缓冲区,你调用 write() 时只要判断返回值是否等于要写入的数据量即可,如果不等,你需要把数据缓存起来下次再发送。

16,215

社区成员

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

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