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())

おすすめ

転載: blog.csdn.net/yasinawolaopo/article/details/131781081