QT学习之旅 - Udp编程注意点

我们在QT中可以使用信号和槽来判断UDP接收数据

connect(qudpsocket,&QUdpSocket::readyRead,this,[=](){});

接收到的是一个完整的包,但是这个包的大小是不固定的,你可以传入任何格式的包,也不受限制,所以,任何ip端口去向这个端口发送数据都可以,从而导致信号的干扰

使用c++中的处理

//1. 开启。WSAData wsaData。0为初始化成功
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
	qDebug() << "Faild init";
}

//2.socket套接字定义和赋值并判断
/*
        AF_INET:IPv4
        SOCK_DGRAM:  是无保障的面向消息的socket,主要用于在网络上发广播信息(UDP)
        SOCK_STREAM: 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。(TCP)
        IPPROTO_UDP: 用于指定UDP协议
*/
SOCKET socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) //UDP模式
if(socket != INVALID_SOCKET){//INVALID_SOCKET:检查错误以确保套接字是有效的套接字
	closesocket(socket);//关闭套接字
}
SOCKET socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) //UDP模式
if(socket == INVALID_SOCKET){//INVALID_SOCKET:检查错误以确保套接字是有效的套接字
	QMessageBox::critical(this, tr("错误"), tr("无法创建 Socket!"));//显示提示
    return;
}

//3.设置本机对方ip端口:sockaddr_in
//sockaddr_in locAddr
locAddr.sin_family = AF_INET;
locAddr.sin_addr.S_un.S_addr = inet_addr("ip地址");
locAddr.sin_port = htons("端口");
//sockaddr_in serverAddr
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.S_un.S_addr = inet_addr(p.DevIP.toStdString().data());
serverAddr.sin_port = htons(p.DevPort.toUInt());

//4.绑定端口并判断
//bind(socket, (sockaddr *)&locAddr,sizeof(locAddr))
if (bind(socket, (sockaddr *)&locAddr,sizeof(locAddr)) == SOCKET_ERROR){
	//绑定失败时处理
}

//5.获取套接字,并设置接收缓冲区长度
int optVal = 0;
int optLen = sizeof(optVal);
getsockopt(udpThread->sockWIN, SOL_SOCKET, SO_RCVBUF, (char*)&optVal, &optLen); //获取套接字,并设置接收缓冲区长度(清空)
optVal = 8*1024*1024;//8M大小
int testRes = setsockopt(udpThread->sockWIN, SOL_SOCKET, SO_RCVBUF, (char*)&optVal, optLen);//testRes=0说明设置成功
//6.开启线程
//QThread->start()

//7.接收数据(重点)
uint8_t recv[1800]; //接收缓存数组
sPRO_INF prot = (sPRO_INF *)recv;//强制类型转换为接收格式.sPRO_INF:自己定义的结构体用来分割接收到的数据格式
int size = recvfrom(sockWIN, (char*)recv, sizeof(recv), 0,(sockaddr *)&rmtAddr, &rmtLen); // 接收数据,返回的是接收到数据的大小

查看16进制

可以是String(QByteArray.toHex())

你可能感兴趣的:(#,Qt,qt,学习,udp)