• 6956阅读
  • 4回复

【提问】关于QUdpSocket(WIN 7 API?) [复制链接]

上一主题 下一主题
离线午小夜
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-16
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
问题描述:
        鄙人最近在编写一个智能控制系统程序,基于Client & Server模式的,是用QUdpSocket通信的.
        在通信过程中,难免有客户端掉线 或者 服务器端掉线的问题发生.掉线后,一些请求就得不到响应了,并且一直发送请求,会造成网络堵塞.所以,程序要求,要对掉线情况进行判断.程序中有心跳机制,来确认掉线状况.在心跳处理函数中,加入了掉线处理代码.
        我选用了Qt类成员函数 qint64 QUdpSocket::writeDatagram ( const QByteArray & datagram, const QHostAddress & host, quint16 port ) /*Sends the datagram datagram to the host address host and at port port. Returns the number of bytes sent on success; otherwise returns -1. */
        我根据这个函数的返回值是否等于-1,来判断请求是否发送成功,间接判断是否掉线.进而对掉线情况作出处理.
        原本,程序在Windows XP 和Linux操作系统中都是可以正确响应掉线后的处理代码.并且,上面提及的那个函数在掉线后输出返回值确实为-1.可是,同样的程序,拿到Windows7和Vista操作系统中运行,程序在掉线后不进入掉线处理代码中.并且上面提及的那个函数在掉线后输出返回值依旧为心跳包在没有掉线状态下发送的长度.而不是-1.



结论&提问:
      
        同样的程序,同样的Qt类成员函数,在WIN XP和LINUX下能够正常返回返回值,而在WIN 7和VISTA操作系统下却不是返回预期的返回值.所以,怀疑,难道这是Qt自身类成员函数设计的问题么?
[ 此帖被午小夜在2009-11-19 15:03重新编辑 ]
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线dbzhang800

只看该作者 1楼 发表于: 2009-11-16
我不懂网络编程,说一下个人看法

UDP 似乎是不可靠连接,它应该只能知道自己有没有发送出去,而应该无法知道对方有没有成功收到数据。
离线午小夜

只看该作者 2楼 发表于: 2009-11-16
在客户端掉线之后,请求是发送不成功的,当程序得知发送失败后作出处理就行了,所以,在WIN7 或者VISTA操作系统下,也应该是返回-1值,从而响应请求发送失败代码的.可是,事实上,拔掉网线,或者断开网络连接后,那个函数的返回值却不是-1.而在WIN XP下又是预期的 -1.就这一点让我很困惑.

引用第1楼dbzhang800于2009-11-16 16:59发表的  :
我不懂网络编程,说一下个人看法
UDP 似乎是不可靠连接,它应该只能知道自己有没有发送出去,而应该无法知道对方有没有成功收到数据。
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线80486

只看该作者 3楼 发表于: 2009-11-17
使用udp协议必须应用自己维持连接可靠性
离线午小夜

只看该作者 4楼 发表于: 2009-11-19
怀疑WIN 7 API函数有很大的变化.
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
快速回复
限100 字节
 
上一个 下一个