UDP通讯测试

这篇具有很好参考价值的文章主要介绍了UDP通讯测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料: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 */
#define CHAR_ADDR_LEN   (16U)

服务器端

#define SERV_PORT 9877 /* TCP and UDP */
#define CHAR_ADDR_LEN   (16U)

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

    char  mesg[MAXLINE];
    char addr[CHAR_ADDR_LEN];

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

        if(-1 == n)
        {
            perror("recvfrom() Error");
        }
        else
        {
            if(NULL == inet_ntop(AF_INET, &((struct sockaddr_in *)p_cli_addr)->sin_addr, addr, CHAR_ADDR_LEN))
            {
                perror("inet_ntop() Error");
            }
            else
            {
                printf("Received %d Bytes : %s From client %s\n", n, mesg, addr);
            }
        }

        n = sendto(sockfd, mesg, n, 0, p_cli_addr, addr_len);
        if(-1 == n)
        {
            perror("sendto() Error");
        }
        else
        {
            printf("Now send back %d Bytes!\n", n);
            fflush(stdout);
        }
    }
}

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);

        if(0 != bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)))
        {
            perror("bind() Error");
        }
        else
        {
            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));
    }

}

测试结果

客户端:

UDP通讯测试,Linux,Ubuntu,udp,单片机,网络协议

服务器:

UDP通讯测试,Linux,Ubuntu,udp,单片机,网络协议

补充知识:

程序员不应操作sockaddr结构,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。文章来源地址https://www.toymoban.com/news/detail-839737.html

到了这里,关于UDP通讯测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑通过串口助手和51单片机串口通讯

    今天有时间把电脑和51单片机之间的串口通讯搞定了,电脑发送的串口数据,单片机能够正常接收并显示到oled屏幕上,特此记录一下,防止后面自己忘记了怎么搞得了。 先来两个图片看看结果吧! 下面是串口3.c的文件全部内容: 下面是oled.h的全部内容: 下面是oled.c的全部内

    2024年02月07日
    浏览(57)
  • STC15系列单片机学习4:串口通讯

    在使用单片机的串口前,得先知道所使用的单片机有几个串口,再结合你的硬件电路图来使用哪个串口。 以下是STC15各系列单片机的串口数量,STC15W4K32S4系列有4个串口 工作模式0:同步移位寄存器(官方建议初学者不学) 工作模式1:8位串口,波特率可变 工作模式2:9位串口

    2024年04月13日
    浏览(44)
  • OpenMV图像处理之后给单片机通讯

    详细介绍:OpenMV扫码识别;OpenMV串口通讯详解;OpenMV的单颜色识别讲解;MSP430F5529库函数学习——串口 目录 接线 OpenMV代码 代码 for...in...部分简单介绍 stm32代码 msp430f5529代码 个人一开始以为我写了的这几个博客已经够清楚了,让各大网友正常使用OpenMV图像处理,然后与单片机

    2024年02月16日
    浏览(66)
  • USART HMI串口屏+单片机通讯上手体验

    🔖本文采用淘晶驰4.3寸IPS串口屏实物验证,HMI串口屏经简单配置即可快速实现,串口通讯效果。串口屏上手简单,有独立的开发套件,容易上手,驱动显示和功能代码独立。本文仅针对串口调试信息显示实现做介绍,不涉及复杂功能实现。 🎞打印输出效果: 🌼模拟类似于

    2024年02月03日
    浏览(46)
  • 利用51单片机实现与RS485通讯,接收数据

    目录 一、研究背景 二、硬件准备 三、软件准备  四、实验原理 五、单片机代码  六、Python读取串口处理数据 七、开发总结          学院给了14天的时间,一枚专业课紧的大三狗匆忙做出来。探索出一种研究阳极氧化工艺电解液中金属离子浓度在线测量和监控的设备和方式

    2024年02月07日
    浏览(45)
  • Proteus8仿真:51单片机使用串口进行双机通讯

    元器件 名称 电阻 RES 51单片机 AT89C51 电容 CAP 晶振 CRYSTAL BCD数码管 7SEG-BCD 串口初始化: 首先根据相关的串口寄存器编写对应的初始化代码: STC89C51单片机设有两个定时器/计数器,因定时器1有4种工作方式,而常选用定时器1的工作方式2(8位自动重装)作为波特率的溢出率。 串口

    2024年02月04日
    浏览(46)
  • 服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败

    首先看看本人情况 解释一下: 1:左边窗口是模拟服务程序,功能是收到消息后把消息打印出来,并把收到的消息再发回给发送消息的主机 2:右边窗口是模拟客户程序,功能是将输入的消息发送给服务程序的主机,并将接收的消息打印出来 3:程序均采用的是UDP网络通讯 问

    2024年02月16日
    浏览(42)
  • STM32单片机CAN通讯连续发送多包数据,发生丢包现象

    使用例程连续发送两三包数据时没有问题,发送多包数据时,发现丢包现象; 例程代码如下: CAN_TxStatus_Failed :状态标志位,不足以判断发送完成,当发送多个数据包时,就会产生问题,修改代码如下: 改成 CAN_TxStatus_Ok 发送成功标志位后,可以连续发送多包数据

    2024年02月16日
    浏览(39)
  • 6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

    IIC简介 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机

    2024年02月20日
    浏览(70)
  • 【C C++开源库】适合单片机 嵌入式的C语言单元测试库_单片机 单元测试框架

    #define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((thres

    2024年04月25日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包