QT5之UDP 通信

Posted fydream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT5之UDP 通信相关的知识,希望对你有一定的参考价值。

UDP通信的优点

UDP无连接通信

  • 可以探测附近的设备
  • 减轻服务端的压力

UDP步骤

服务端

  1. 定义一个套接字s
  2. 定义文件描述符
  3. 定义缓冲字符串
  4. 申请一个套接字作用在文件描述符上
    1. 参数一:协议 -> IPv4/IPv6 PF_INET/PF_INET6
    2. 参数二:套接字类型 -> UDP无连接/TCP有连接 SOCK_DGRAM/SOCK_STREAM
    3. 参数三:申请套接字
  5. 刷新套接字s 为zero
  6. 赋值:

    s.sin_family = AF_INET; //IPV4协议族
    s.sin_port = htons(8888); //端口号
    s.sin_addr.s_addr = INADDR_ANY; //默认地址0x00000000
  1. 绑定端口

    1. 参数一:输入文件描述符
    2. 参数二:套接字的地址&s
    3. 参数三:s的大小

    这个套接字有了本地IP,端口,通信协议

  2. 接收客户端发来的信息

    1. 参数一:套接字
    2. 参数二:缓冲字符串
    3. 参数三:缓冲字符串的大小
    4. 参数四:标志位设置为0
    5. 参数五:套接字s的地址
    6. 参数六:套接字s的长度的二地址

客户端

1 ~ 6 的步骤与服务端相同

  1. 对字符串幅值
  2. 发送数据

? 参考: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 通信的主要内容,如果未能解决你的问题,请参考以下文章

Python 之 Socket编程(TCP/UDP)

Qt之UDP通信

UOS系统UDP通信时绑定不了端口

Socket 通信之 UDP 通信

QT之UDP通信

Python中的端口协议之基于UDP协议的通信传输