最近在学习qt下socket开发,今天先学习了一下qt下udp socket的开发。参考了qt5的文档。以及一些其他的参考书。
UDP是指user datagram protocol ,用户数据报协议,是一种轻量级,不可靠的,面向数据报的,非链接的协议。常用在一下对数据可靠性要求不是很重要的程序中。
这个类最常用的方式就是利用bind()函数绑定到某一地址和端口,然后调用 writeDategram()函数和
readDatagram()函数进行数据传输。
如果你想要使用标准的QIODevice函数例如read(),readLine(),write()等,你必须首先利用connectToHost()函数把socket直接连接到通信的另一端。
socket每向网络写入一个数据报就会发射bytesWritten()信号。如果你只是想发送一份数据报,你并不需要调用bind()函数进行绑定。
无论何时有数据报到达时 socket就会发射readyRead()信号。这样的话,hasPendingDatagram()函数会返回true值。然后调用 pendingDatagramSize()函数来获得到达的第一份数据报的字节大小,最后调用readDatagram()函数来读取到达的数据报。
最后要注意的一点是:当收到readyRead()信号时,已到达的数据报都应该被读取,否则,当下一次有数据报到达的时候,readyRead()信号就不会发射了。
下面是QT参考文档上的一个例子:
void server::initSocket()
{
udpSocket = new QUdpSocket(this);//构建一个udpsocket;
udpSocket->bind(QHostAddress::LocalHost,7755);//绑定到本机地址的7755端口
//连接readyRead()信号与槽readPendingDatagram()来读取数据报
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readPendingDatagram()));
}
void server::readPendingDatagram() //读取数据的槽实现
{
while(udpSocket->hasPendingDatagram())//只要socket有数据到达,一直循环的读取
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());//调整datagram的大小与socket收到的数据大小一样
QHostAddress sender;//发送者的地址
qint64 senderPort;//发送者的端口号
udpSocket->readDatagram(datagram.data(),datagram.size(),&sender,&senderPort);//读取数据报
processTheDatagram(datagram);//处理读取到的数据报
}
}

967

被折叠的 条评论
为什么被折叠?



