BUG1 readyRead只被触发一次
UDP使用writeDatagram发送数据,如果没有程序readDatagram接收数据,就只会触发一次readyRead,之后发送的数据都不会触发readyRead。
BUG1解决
在readyRead触发后,一定要在关联的槽函数中调用readDatagram及时读取数据。
BUG2 readDatagram读取到空数据
readyRead信号触发原理:
当有程序触发TCP/IP协议来到我的QT程序,也就是数据从系统到QT应用程序,ReadyRead就会被触发,与绑定端口是否接收到数据无关。
问题描述:
在同一个程序下发送数据给本机端口8888并监听端口8889,
如果没有其他程序监听8888,,也就是自己的程序会触发readyRead信号,
并且hasPendingDatagrams会返回true,但是我们从8889读取数据会出现读取出空数据或者随机字符的情况(因为并没有往8889发送数据,但是我们却从8889读取数据了)。
BUG2解决
1. 在其他程序中bind 8889端口
但是在其他程序挂掉的时候,自己的程序很容易出现一些莫名其妙的bug。比如自己发送给别的程序的数据却触发了自己信号的槽函数,或者写在循环中,数据取不出来导致一直循环读取空数据。
2. 在自己的接收函数中对readDatagram的返回值进行判定。
readDatagram的返回值:数据获取成功返回数据长度,数据获取失败返回-1
补充
这两个bug在Linux并不存在,Linux下不会因为自己程序发送数据触发自己程序另一个绑定端口的readyRead。