QT5之UDP 通信
UDP通信的优点
UDP无连接通信
- 可以探测附近的设备
- 减轻服务端的压力
UDP步骤
服务端
- 定义一个套接字s
- 定义文件描述符
- 定义缓冲字符串
- 申请一个套接字作用在文件描述符上
- 参数一:协议 -> IPv4/IPv6 PF_INET/PF_INET6
- 参数二:套接字类型 -> UDP无连接/TCP有连接 SOCK_DGRAM/SOCK_STREAM
- 参数三:申请套接字
- 刷新套接字s 为zero
- 赋值:
s.sin_family = AF_INET; //IPV4协议族
s.sin_port = htons(8888); //端口号
s.sin_addr.s_addr = INADDR_ANY; //默认地址0x00000000
-
绑定端口
- 参数一:输入文件描述符
- 参数二:套接字的地址&s
- 参数三:s的大小
这个套接字有了本地IP,端口,通信协议
-
接收客户端发来的信息
- 参数一:套接字
- 参数二:缓冲字符串
- 参数三:缓冲字符串的大小
- 参数四:标志位设置为0
- 参数五:套接字s的地址
- 参数六:套接字s的长度的二地址
客户端
1 ~ 6 的步骤与服务端相同
- 对字符串幅值
- 发送数据
参考:UDP简单实战
源码
//服务端:接收
int main()
{
struct sockaddr_in s; //定义套接字
int sock; //定义文件表述符
char buff[182]; //缓冲数组
if((sock = socket(AF_INET, SOCK_DGRAM, 0))==-1)
perror("error");
memset(&s,0,sizeof(s)); //刷新
s.sin_family = AF_INEF;
s.sin_port = htons(8888);
s.sin_addr.s_addr = INADDR_ANY;
if( bind(sock, (struct sockaddr *)&s, sizeof(s)) == -1 )
perror("error");
int sock_len = sizeof(s);
recvfrom( sock, buff, sizeof(buff)-1, 0, (struct sockaddr *)&s, &sock_len);
printf("message:%s", buff);
return 0;
}
//客户端:发送
int main()
{
struct sockaddr_in s; //定义套接字
int sock; //定义文件表述符
char buff[182]; //缓冲数组
if((sock = socket(AF_INET, SOCK_DGRAM, 0))==-1)
perror("error");
memset(&s,0,sizeof(s)); //刷新
s.sin_family = AF_INEF;
s.sin_port = htons(8888);
s.sin_addr.s_addr = INADDR_ANY;
scanf("%s", buff); //对字符串进行赋值
sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&s, sizeof(s));
return 0;
}
总结
UDP通信需要的因素:
- 双方的端口号
- 对方的IP (自己的IP手动设置)
QT实战
pro文件
加入network环境:在core gui后面加入 network
QT += core gui network
mainwindow.cpp
udpsocket=new QUdpSocket(this); //新建一个套接字socket
/* 绑定本机端口号,允许其他服务器绑定同样的IP和端口,即使改地址被另外一个套接字绑定也应该重新绑定 */
udpsocket->bind((quint16)51303, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(recvMsg())); // 发起连接
/* 关闭UDP */
udpsocket -> close();
/* 接收信息 */
void MainWindow::recvMsg(){
if(udpsocket->hasPendingDatagrams()){
QByteArray datagram;
datagram.resize(udpsocket->pendingDatagramSize());
udpsocket->readDatagram(datagram.data(),datagram.size());
ui->listWidget->insertItem(0,datagram);
}
}
QHostAddress addr("192.168.1.100"); //目标地址
QByteArray msg;
msg.append(ui->lineEdit->text()); //发送信息内容
udpsocket->writeDatagram(msg,addr,(quint16)51303); //发送目标机的地址和端口号
mainwindow.h
加入UDP头文件
#include <QUdpSocket>
公共成员声明
public:
QUdpSocket *udpsocket;
增加声明一个private slots
private slots:
void recvMsg();
参考:写个小小的UDP客户端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)