Linux使用套接字 udp协议传输

该文详细阐述了UDP套接字的创建过程,包括在Qt环境下使用qtcreator6在win10虚拟机和ubuntu20.04上进行开发。内容涉及创建套接字、绑定地址、设置非阻塞模式以及调整接收缓冲区大小。同时,分别介绍了接收方和发送方的基本步骤,如recvfrom和sendto函数的使用。
摘要由CSDN通过智能技术生成

第一步是来认识库,需要哪些库,需要哪些库中的函数

哥们也只是,初学者,仅仅只是会调用的地步。后面有机会再加深。
首先咱们需要清除的知道工作流程
工作流程,偷的图,嘻嘻

第二步是直接写代码

开发工具 qtcreator6 环境 win10 虚拟机 ubuntu20.04 运行环境 香橙派5
添加头文件
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
接收方
1.创捷套接字
2.bind绑定套接字
3.循环接收,或者发送

 	sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //套接字sockfd
    if (sockfd < 0)
    {
        qDebug() << "Failed to create socket";
    }
    // 绑定地址和端口号
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        emit Respond("Failed to bind");
    }
    len = sizeof(cliaddr);

    int flags = fcntl(sockfd, F_GETFL, 0);
    if (flags < 0)
    {

        emit Respond("Failed to fcntl1");
    }
    if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)  //设置套接字为非阻塞,套接字内部还有一些参数可以设置,比如接收缓冲区,等待延时。创建套接字默认是阻塞模式,什么是阻塞模式呢,就是recvfrom没有从系统中拿到数据就会一直阻塞再recvform函数中不出来,不return。
    {
        emit Respond("Failed to fcntl2");
    }

    int rcvbufsize = 100 * 1024 * 1024;  //设置套接字接收缓冲区,好像有个默认限值,
    if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbufsize, sizeof(rcvbufsize)) < 0)
    {
        emit Respond("Failed to setsockopt");
    }

    while (!stop)  //这是我的线程,stop用来停止线程
    {
        n = recvfrom(sockfd, buffer.data(), MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);  //buffer是bytearry 字节数组,不用qt的请自行定义
        if (n > 0)
        {
			...//n>0 就是从内核中拿到数据了
        }
    }
    close(sockfd);

以我认为详细的方式讲解下
创建套接字就是从内核拿一个网络句柄,用来跟内核搭桥通信。
绑定是为了过滤消息,收到别的消息,就不拿,拿指定特征的消息。可以省略这一步。
套接字默认接收缓冲很小,udp的运用环境一般都是为了高速,所以一般都要增大缓冲区。

发送方
很简单
1.创建套接字
2.设置要发送的地址
3.发送

sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //套接字sockfd
    if (sockfd < 0)
    {
        qDebug() << "Failed to create socket";
    }
    // 绑定地址和端口号
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);
    ret = sendto(sockfd,buffer,strlen(buffer),0,&servaddr,sizeof(servaddr));
	if(ret < 0)
	{
			qDebug() << "Failed to create socket";
			continue;
	}

注意设置servaddr的参数,INADDR_ANY和PORT 指定的数据格式填入,怎么转换为指定的数据格式请www.baidu.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值