QT5之UDP 通信
Posted fydream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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客户端
以上是关于QT5之UDP 通信的主要内容,如果未能解决你的问题,请参考以下文章