8.2 UDP通信过程
首先,UDP通信是无连接的,虽然不可靠但是传输效率高,UDP就像是写信,知道地址即可,TCP就像是打电话,确保目标正确。
在UDP服务器端,通信套接字直接绑定,如果对方发数据,套接字自动触发readyRead(),发是通过槽函数实现。
在UDP客户端,通信套接字直接绑定,如果对方发数据,套接字自动触发readyRead(),发是通过槽函数实现。
实际上,UDP并不着重区分客户端与服务器端,两者都是只需要一个通信套接字,并不需要监听,当通信套接字的readyRead信号有效之后自动读取。
读取:
首先是获取发送方的IP地址,通过通信套接字中的readDatagram()函数来实现,传入的参数:
qint64 QUdpSocket:: readDatagram ( char * data , qint64 maxSize , QHostAddress * address = Q_NULLPTR, quint16 * port = Q_NULLPTR)
Receives a datagram no larger than maxSize bytes and stores it in data .The sender's host address and port is stored in * address and * port (unless the pointers are 0).
Returns the size of the datagram on success; otherwise returns -1.
根据函数介绍可知,函数的第一个传入参数为用于存储接收数据的变量地址,形参为char *表明传入参数应为一个地址。
第二个参数为接收缓冲区的大小,
第三个参数为主机IP,格式为QhostAddress*,所以应该传入一个该类型的变量地址。
第一个参数为端口号,格式为uint16,同样传入一个该类型的变量地址,
处理函数:
voidWidget::dealMsg()
//读取对方发送的内容
charbuf[1024]={0};
QHostAddresscliAddr; //对方地址
quint16port; //对方端口
qint64len=udpSocket->readDatagram(buf,sizeof(buf),&cliAddr,&port);
if(len>0) //>0表示读取到东西
//格式化,字符串组包
QStringstr=QString("[%1:%2]%3").arg(cliAddr.toString()).arg(port).arg(buf);
//给编辑区设置内容
ui->textEdit->setText(str);
}
发送:
当按键按下后,首先获取ip和port,
//发送数据
voidWidget::on_buttonSend_clicked()
//发送时先获取对方的IP和端口
QStringip=ui->lineEditIP->text();