UDP通讯测试

news2024/11/17 7:22:00

参考资料:UNIX网络编程

实验平台:PC为client,RaspberryPi为server

基本类型和接口函数,参考man手册

    #include <sys/socket.h>

       struct sockaddr {
           sa_family_t     sa_family;      /* Address family */
           char            sa_data[];      /* Socket address */
       };

       #include <netinet/in.h>

       struct sockaddr_in {
           sa_family_t     sin_family;     /* AF_INET */
           in_port_t       sin_port;       /* Port number */
           struct in_addr  sin_addr;       /* IPv4 address */
       };

       struct in_addr {
           in_addr_t s_addr;
       };

       typedef uint32_t in_addr_t;
       typedef uint16_t in_port_t;


       #include <sys/socket.h>
       ssize_t sendto(int sockfd, const void buf[.len], size_t len, int flags,
                      const struct sockaddr *dest_addr,
                      socklen_t addrlen);
       
       ssize_t recvfrom(int sockfd, void buf[restrict .len], size_t len, int flags,
                        struct sockaddr *src_addr,
                        socklen_t *addrlen);
       
            
      #include <arpa/inet.h>
       int inet_pton(int af, const char *restrict src, void *restrict dst);
       
       const char *inet_ntop(int af, const void *restrict src, char dst[restrict .size], socklen_t size);

       
       
       
       #include <arpa/inet.h>

       int inet_pton(int af, const char *restrict src, void *restrict dst);

服务器端


#define SERV_PORT 9877 /* TCP and UDP */


void dg_echo(int sockfd, struct sockaddr *p_cli_addr, socklen_t addr_len)
{
    int  n;
    socklen_t len;

    char  mesg[MAXLINE];
    char addr[addr_len];

    for ( ; ; )
    {
        len = addr_len;
        n = recvfrom(sockfd, mesg, MAXLINE, 0, p_cli_addr, &len);

        if(len != 0)
        {
            inet_ntop(AF_INET, &((struct sockaddr_in *)p_cli_addr)->sin_addr, addr, len);
            printf("Received %d Bytes : %s From client %s\n", n, mesg, addr);
        }

        printf("Now send back!\n");
        fflush(stdout);

        sendto(sockfd, mesg, n, 0, p_cli_addr, len);
    }
}

void server_main(void)
{
    int sockfd;
    struct sockaddr_in  serv_addr, cli_addr;


    /* IPPROTO_IP = 0 */      /* Dummy protocol for TCP.  */
    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(sockfd < 0)
    {
        perror("socket fail");
    }
    else
    {
        memset(&serv_addr, 0, sizeof(serv_addr));

        serv_addr.sin_family = AF_INET;

        /* /usr/include/netinet/in.h */
        /* Address to accept any incoming messages.  */
        /* #define INADDR_ANY   ((in_addr_t) 0x00000000) */
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        //inet_pton(AF_INET, "192.168.39.39", &servaddr.sin_addr);
        serv_addr.sin_port = htons(SERV_PORT);

        bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

        dg_echo(sockfd, (struct sockaddr *)&cli_addr, sizeof(cli_addr));
    }
}

客户端

void dg_cli(FILE *fp, int sockfd, const struct sockaddr *p_serv_addr, socklen_t addr_len)
{
    int n;
    socklen_t len;

    struct sockaddr_in reply_addr;
    char sendline[MAXLINE];
    char recv_buf[MAXLINE + 1];
    char recv_addr[addr_len];

    while (fgets(sendline, MAXLINE, fp) != NULL)
    {
        sendto(sockfd, sendline, strlen(sendline), 0, p_serv_addr, addr_len);

        printf("send successfully!\n");
        fflush(stdout);

        n = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr *)&reply_addr, &len);

        printf("receive success!\n");
        fflush(stdout);

        inet_ntop(AF_INET, &reply_addr.sin_addr, recv_addr, len);

        if((len != addr_len) || (memcmp(p_serv_addr, (struct sockaddr *)&reply_addr, len) != 0))
        {
            printf("Replied from %s ignored!\n", recv_addr);
            continue;
        }
        else
        {
            printf("Replied from %s with:\n", recv_addr);
        }

        recv_buf[n] = '\0';   /* null terminate */
        fputs(recv_buf, stdout);
    }
}

void client_main(const char *src)
{
    int  sockfd;
    struct sockaddr_in serv_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERV_PORT);

    inet_pton(AF_INET, src, &serv_addr.sin_addr);

    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if(sockfd < 0)
        perror("socket");
    else
    {
        printf("socket len: %ld\n", sizeof(serv_addr));
        dg_cli(stdin, sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    }

}

测试结果

客户端:

服务器:

补充知识:

程序员不应操作sockaddr结构,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1515433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LDK加密狗的多种功能特点

LDK加密狗是一种在软件保护领域广泛应用的硬件加密设备&#xff0c;它为软件提供了强有力的版权保护&#xff0c;确保软件开发商的权益得到充分保障。本文将从LDK加密狗的工作原理、功能特点、应用场景以及未来发展等方面进行详细阐述。 LDK加密狗的工作原理基于硬件加密技术。…

2 配置虚拟机

1.打开VM&#xff0c;主页的界面如下&#xff0c;点击"创建新的虚拟机" 2.选择“自定义&#xff08;高级&#xff09;”&#xff0c;然后点击下一步&#xff0c;如下图所示&#xff1a; 3.下图直接点击“下一步” 4.下图的界面上&#xff0c;注意&#xff0c;不要选择…

打卡学习kubernetes——kubernetes架构原理

接上一篇的内容&#xff0c;除了核心组件&#xff0c;还有一些推荐的Add-ons&#xff1a; kube-dns 负责为整个集群提供DNS服务Ingress Controller 为服务提供外网入口Heapster 提供资源监控&#xff08;没用过这个&#xff0c;但是用过grafana&#xff0c;很方便&#xf…

蓝桥杯-质因数问题

约数&#xff0c;又称因数&#xff1a;a % b 0,则b称为a的约数&#xff0c;包括1和a。 例如4的正约数有&#xff1a;1、2、4。6的正约数有&#xff1a;1、2、3、6。质因数&#xff1a; 质因数&#xff08;素因数或质因子&#xff09;在数论里是指能整除给定正整数&#xff08;…

Unity中PICO中手柄按键返回值

文章目录 前言一、我们看一下每个按键返回值获取按键返回值的方法 二、我们实现一个左摇杆控制平滑移动的功能1、创建一个左摇杆控制移动的脚本2、传入XR Origin对象&#xff0c;并且定义一个公开变量控制移动速度3、获取到摇杆是否移动&#xff0c;以及移动的偏移量4、如果摇杆…

Python算法(列表排序)

一。冒泡排序&#xff1a; 列表每两个相邻的数&#xff0c;如果前面比后面大&#xff0c;则交换这两个数 一趟排序完成后&#xff0c;则无序区减少一个数&#xff0c;有序区增加一个数 时间复杂度&#xff1a;O(n*n) 优化后&#xff1a;已经排序好后立马停止&#xff0c;加快…

雅特力AT32A403开发板评测 01 开箱及环境搭建流程

01-雅特力AT32A403A开发板开箱及环境搭建流程 雅特力AT32 2023年&#xff0c;玩了不少的国产MCU开发板&#xff0c;例如武汉芯源CW32&#xff0c;兆易创新GD32、上海航芯ACM32、沁恒CH32V307等开发板&#xff0c;虽然电子工程世界论坛也有雅特力AT32开发板的评测活动&#xf…

yolov5模型压缩-torch_pruning

参考论文:DepGraph: Towards Any Structural Pruning(https://arxiv.org/abs/2301.12900) 主要原理:物理的移除参数,并自动找出层与层以及层之间的依赖,完成模型的自动裁剪 模型压缩效果:yolov5剪枝流程如下: pip install torch_pruning 新建prune.py: import torch_…

Spring框架--IOC容器全集

一&#xff1a;Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&#xff…

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…

HCIP —— BGP 路径属性 (上)

目录 BGP 路径属性 1.优选Preferred-Value属性值最大的路由 2.优选Local-preference 属性数值大的路由 3.本地始发的BGP路由优先于其他对等体处学习到的路由。 4..优选AS_PATH属性值最短的路由 BGP 路径属性 BGP的路由选路是存在优选规则的&#xff0c;下图为华为官网提供…

HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

第10集《天台教观纲宗》

请大家打开讲义第十七页。我们讲到己二、结申正义。 己二、结申正义 《法华经》把我们修行人修行的相貌&#xff0c;比喻作一个车乘。车乘就是一种交通工具&#xff0c;它能够让我们从此岸超越到彼岸去。所以修行它是可以超越的&#xff0c;你今天比昨天超越了&#xff0c;就好…

5、Design Script之Class和函数

使用函数作为参数 DesignScript允许使用函数作为参数。例如&#xff0c;你可以在CodeBlock中调用两个函数。 要在单个代码块中多次调用一个函数&#xff0c;你需要在每个函数各自的行上编写它。 startPoint Autodesk.DesignScript.Geometry.Point.ByCoordinates(); endPoin…

从零开始学习深度学习库-2:反向传播

欢迎来到本系列的第二篇文章&#xff0c;我们将从头开始构建一个深度学习库。 本博客系列的代码可以在这个Github仓库中找到。 上一篇文章 在上一篇文章中&#xff08;链接见这里&#xff09;&#xff0c;我们实现了线性层和常见的激活函数&#xff0c;并成功构建了神经网络的…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

2024考研计算机考研复试-每日重点(第二十期)

公众号“准研计算机复试”&#xff0c;超全大佬复试资料&#xff0c;保姆级复试&#xff0c;80%的题目都是上岸大佬提供的。 研宝们&#xff0c;App更新啦&#xff01; 计算机组成原理&#xff1a; 10.☆什么是数据存储的大端模式和小端模式&#xff1f; 大端模式&#xff1a;数…

防火墙基础理论(二)

漏洞扫描&#xff0c;设备联动 阻断未知威胁&#xff1a; 基于大数据统计 从运营角度管理设备 采集流量分析上报&#xff0c;探针

零知识玩转AVH(5)—— 怎么玩(4)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;4&#xff09;—— 怎么玩&#xff08;3&#xff09; 上一回经过了一个艰苦的探索过程&#xff0c;最终完成了“arm-avh-best-practice-project-product-subscription-guide-cn.pdf”即“Arm虚拟硬件实践专题一&#xff1a;产…

【Java系列】OOM 时,JVM 堆栈信息保存和分析

一、前言 在日常开发中&#xff0c;即使代码写得再谨慎&#xff0c;免不了还是会发生各种意外的事件&#xff0c;比如服务器内存突然飙高&#xff0c;又或者发生内存溢出(OOM)。当发生这种情况时&#xff0c;我们怎么去排查&#xff0c;怎么去分析原因呢&#xff1f; 一般遇到…