UDP通信 (C语言实现)

2023-05-16

直接看代码吧      v๑乛◡乛๑

udp_server.c

/*********************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名:  udp_server.c
** 创   建   人: ***
**
** 文件创建日期: ** 年 ** 月 ** 日
**
** 描        述: UDP 回射服务器程序
*********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define __UDP_ECHO_TYPE_CLIENT          1                               /* 客户端模式                   */
#define __UDP_ECHO_TYPE_SERVER          2                               /* 服务器模式                   */
#define __UDP_ECHO_TYPE                 (__UDP_ECHO_TYPE_SERVER)        /* 当前模式选择                 */
#define __UDP_ECHO_IP_CLIENT            "10.4.0.95"                     /* 客户端 IP 地址               */
#define __UDP_ECHO_IP_SERVER            "10.4.0.96"                     /* 服务器 IP 地址               */
#define __UDP_ECHO_PORT_CLIENT          8000                            /* 客户端端口号                 */
#define __UDP_ECHO_PORT_SERVER          8001                            /* 服务器端口号                 */
#define __UDP_ECHO_BUFF_SIZE_CLIENT     257                             /* 客户端接收缓冲区大小         */
#define __UDP_ECHO_BUFF_SIZE_SERVER     257                             /* 服务器接收缓冲区大小         */
/*********************************************************************************************************
** 函数名称: __UdpEchoServer
** 功能描述: UDP 回射服务器程序
** 输 入  : NONE
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static int  __UdpEchoServer (void){
    int                 iRet      = -1;                                 /* 操作结果                     */
    int                 sockFd    = -1;                                 /* socket 描述符                */
    socklen_t           uiAddrLen = sizeof(struct sockaddr_in);         /* 地址结构大小                 */
    register ssize_t    sstRecv   = 0;                                  /* 接收到的数据长度             */
    char                cRecvBuff[__UDP_ECHO_BUFF_SIZE_SERVER] = {0};   /* 接收缓冲区                   */
    struct sockaddr_in  sockaddrinLocal;                                /* 本地地址                     */
    struct sockaddr_in  sockaddrinRemote;                               /* 远端地址                     */

    fprintf(stdout, "UDP echo server start.\n");

    sockFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);                  /* 创建 socket                  */
    if (sockFd < 0) {                                                   /* 操作失败                     */
        printf("UDP echo server socket error.\n");
        return  (-1);                                                   /* 错误返回                     */
    }

    /*
     * 初始化本地地址结构
     */
    memset(&sockaddrinLocal, 0, sizeof(sockaddrinLocal));               /* 清空地址信息                 */

    sockaddrinLocal.sin_len         = sizeof(struct sockaddr_in);       /* 地址结构大小                 */
    sockaddrinLocal.sin_family      = AF_INET;                          /* 地址族                       */
    sockaddrinLocal.sin_addr.s_addr = INADDR_ANY;
    sockaddrinLocal.sin_port        = htons(__UDP_ECHO_PORT_SERVER);    /* 绑定服务器端口               */

    iRet = bind(sockFd, (struct sockaddr *)&sockaddrinLocal, sizeof(sockaddrinLocal));
                                                                        /* 绑定本地地址与端口           */
    if (iRet < 0) {                                                     /* 绑定操作失败                 */
        close(sockFd);                                                  /* 关闭已经创建的 socket        */
        fprintf(stderr, "UDP echo server bind error.\n");
        return  (-1);                                                   /* 错误返回                     */
    }

    for (;;)
    {
        memset(&cRecvBuff[0], 0, __UDP_ECHO_BUFF_SIZE_SERVER);          /* 清空接收缓冲区               */
        sstRecv = recvfrom(sockFd,(void *)&cRecvBuff[0], __UDP_ECHO_BUFF_SIZE_SERVER,
                           0, (struct sockaddr *)&sockaddrinRemote, &uiAddrLen);
                                                                        /* 从远端接收数据               */
        if (sstRecv <= 0) {                                             /* 接收数据失败                 */
            if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {       /* 非超时与非阻塞               */
                 close(sockFd);                                         /* 关闭已经创建的 socket        */
                 fprintf(stderr, "UDP echo server recvfrom error.\n");
                 return  (-1);
            }

            continue;
        }

        sendto(sockFd, (const void *)&cRecvBuff[0], sstRecv, 0,
               (const struct sockaddr *)&sockaddrinRemote, uiAddrLen);
    }//for

}
int main(int argc, char* argv[]){
    __UdpEchoServer();
    return 0;
}
/*********************************************************************************************************
  END
*********************************************************************************************************/

udp_client.c

/*********************************************************************************************************
** 文   件   名: udp_client.c
**
** 创   建   人: ***
**
** 文件创建日期: ** 年 ** 月 ** 日
**
** 描        述: UDP 回射客户端程序
*********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define __UDP_ECHO_TYPE_CLIENT          1                               /* 客户端模式                   */
#define __UDP_ECHO_TYPE_SERVER          2                               /* 服务器模式                   */
#define __UDP_ECHO_TYPE                 (__UDP_ECHO_TYPE_CLIENT)        /* 当前模式选择                 */
#define __UDP_ECHO_IP_CLIENT            "10.4.0.96"                     /* 客户端 IP 地址               */
#define __UDP_ECHO_IP_SERVER            "10.4.0.95"                     /* 服务器 IP 地址               */
#define __UDP_ECHO_PORT_CLIENT          8000                            /* 客户端端口号               */
#define __UDP_ECHO_PORT_SERVER          8001                            /* 服务器端口号               */
#define __UDP_ECHO_BUFF_SIZE_CLIENT     257                             /* 客户端接收缓冲区大小       */
#define __UDP_ECHO_BUFF_SIZE_SERVER     257                             /* 服务器接收缓冲区大小       */
/*********************************************************************************************************
** 函数名称: __UdpEchoClient
** 功能描述: UDP 回射客户端程序
** 输 入  : NONE
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static int  __UdpEchoClient (void)
{
    int                  sockFd     = -1;                               /* socket 描述符                */
    socklen_t            uiAddrLen  = sizeof(struct sockaddr_in);       /* 地址结构大小                 */
    register ssize_t     sstRecv    = 0;                                /* 接收到的数据长度             */
    register ssize_t     sstSend    = 0;                                /* 接收到的数据长度             */
    const char          *pcSendData = "SylixOS Hello!\n";               /* 需要发送的字符串             */
    char                 cRecvBuff[__UDP_ECHO_BUFF_SIZE_CLIENT] = {0};  /* 接收缓冲区                   */
    struct sockaddr_in   sockaddrinRemote;                              /* 远端地址                     */

    fprintf(stdout, "UDP echo client start.\n");


    sockFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);                  /* 创建 socket                  */
    if (sockFd < 0) {
        fprintf(stderr, "UDP echo client socket error.\n");
        return  (-1);
    }

    /*
     * 初始化远端地址结构
     */
    memset(&sockaddrinRemote, 0, sizeof(sockaddrinRemote));
    if (!inet_aton(__UDP_ECHO_IP_SERVER, &sockaddrinRemote.sin_addr)) { /* 地址转换错误                 */
        close(sockFd);                                                  /* 关闭已经创建的 socket        */
        fprintf(stderr, "UDP echo client get addr error.\n");
        return  (-1);                                                   /* 错误返回                     */
    }

    sockaddrinRemote.sin_len    = sizeof(struct sockaddr_in);           /* 地址结构大小                 */
    sockaddrinRemote.sin_family = AF_INET;                              /* 地址族                       */
    sockaddrinRemote.sin_port   = htons(__UDP_ECHO_PORT_SERVER);        /* 绑定服务器端口               */

    for (;;) {
        fprintf(stdout, "Send Data: %s", pcSendData);
        sstRecv = strlen(pcSendData);                                   /* 获取发送字符串长度           */
        sstSend = sendto(sockFd, (const void *)pcSendData, sstRecv, 0,
                         (const struct sockaddr *)&sockaddrinRemote, uiAddrLen);
                                                                        /* 发送数据到指定的服务器端     */
        if (sstSend <= 0) {                                             /* 发送数据失败                 */
            if ((errno != ETIMEDOUT) && (errno != EWOULDBLOCK)) {       /* 非超时与非阻塞               */
                 close(sockFd);                                         /* 关闭已经创建的 socket        */
                 fprintf(stderr, "UDP echo client sendto error.\n");
                 return  (-1);                                          /* 错误返回                     */
            }

            continue;                                                   /* 超时或非阻塞后重新运行       */
        }

        memset(&cRecvBuff[0], 0, __UDP_ECHO_BUFF_SIZE_CLIENT);
        sstRecv = recvfrom(sockFd, (void *)&cRecvBuff[0], __UDP_ECHO_BUFF_SIZE_SERVER,
                           0, (struct sockaddr *)&sockaddrinRemote, &uiAddrLen);
                                                                        /* 从远端接收数据               */
        if (sstRecv <= 0) {                                             /* 接收数据失败                 */
            if ((errno != ETIMEDOUT) &&(errno != EWOULDBLOCK)) {        /* 非超时与非阻塞               */
                 close(sockFd);                                         /* 关闭已经创建的 socket        */
                 fprintf(stderr, "UDP echo client recvfrom error.\n");
                 return  (-1);                                          /* 错误返回                     */
            }

            continue;                                                   /* 超时或非阻塞后重新运行       */
        }

        fprintf(stdout, "Recv Data: ");
        cRecvBuff[sstRecv] = 0;
        fprintf(stdout, "%s\n", &cRecvBuff[0]);

        sleep(5);                                                       /* 休眠一段时间                 */
    }//for

    return  (0);
}

int main(int argc, char* argv[]){
    __UdpEchoClient();
    return 0;
}
/*********************************************************************************************************
  END
*********************************************************************************************************/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP通信 (C语言实现) 的相关文章

  • 在 Android 上显示实时 UDP 或 RTP 流(组播)

    我刚接触 Android 开发几周 我需要编写一个应用程序 可以向用户显示以 UDP 或 RDP 多播的实时流 该流位于诸如 rtp 230 0 0 11 1234 之类的地址 并通过该模块通过 WIFI 发出 我已经尝试从播放器 Daro
  • 是否可以在 socket.io 中使用 UDP?

    我正在开发一款游戏 听说 UDP 更适合实时游戏 我知道 socket io 使用 TCP 并且想知道是否有某种方法可以将其切换到 UDP 我尝试查找它 但只找到了 2012 年左右的帖子 其中说 UDP 仅在浏览器中处于实验阶段 从标准浏
  • 从 iOS 应用程序上的 UDP 服务器接收数据无法在 Linux 服务器上工作,但可以在 macbook pro 上工作 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 背景 我做
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • 如何在多个程序中接收相同的udp流?

    我有一个封闭的第三方系统 它发送单播 UDP 流 MPEG TS 我想在同一台计算机上的两个不同程序中访问该流 我无法更改源上的任何内容 甚至无法更改 IP 或端口 除了编写自己的小程序来捕获流然后创建新流并重新发送这两个流之外 还有其他选
  • udp数据包被tcpdump捕获,但没有被套接字接收[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我编写了一个 rawudp 程序 通过原始套接字发送 udp 数据包 按照网页http www tenouk com Module43a html h
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • NodeJS UDP 多播如何

    我正在尝试将 UDP 多播数据包发送到 230 185 192 108 以便每个订阅的人都会收到 有点卡住了 我相信它的广播正确 但似乎无法从任何客户端获取任何信息 Server var news Borussia Dortmund win
  • 用于接收 UDP 数据包的可变大小缓冲区

    我有一个 UDP 套接字 它将接收一些可能不同大小的数据包 并且我异步处理它 socket async receive from boost asio buffer buffer 65536 senderEndpoint handler 这
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • UDP sendto 上的 ECONNREFUSED 错误

    我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto 向多个端口发送 UDP 数据 所有端口均使用套接字 PF INET SOCK DGRAM 0 为了一组客户端读取进程的利益 这些 sendto 偶尔会不可预测地触发经济
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • 使用 Boost.Asio 进行广播的问题

    如果问题之前已得到解答 我提前表示歉意 但我已经搜索并没有找到任何对我有帮助的东西 正如问题标题所示 我正在尝试将包从服务器广播到一组侦听任何消息的客户端 客户端将计算一秒钟内收到的消息数 服务器端的事情是这样的 class Server
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是

随机推荐

  • 头文件相互包含问题

    先来看看以下这个例子 xff1a Keyboard h的代码为 span class token macro property span class token directive hash span span class token di
  • 解决roslaunch启动stage_ros节点仿真时输出rostopic hz速率较低的问题(始终为10Hz)

    问题描述 xff1a 在实验过程中偶然间发现无论是odom还是laser scan的输出频率都只有10Hz clock输出速率有50Hz 直接使用命令 rosrun stage ros stageros test world能够正常输出50
  • STM32八种IO口模式区别

    xff08 1 xff09 GPIO Mode AIN 模拟输入 xff08 2 xff09 GPIO Mode IN FLOATING 浮空输入 xff08 3 xff09 GPIO Mode IPD 下拉输入 xff08 4 xff09
  • linux下C++实现Http请求类(GET,POST,上传,下载)

    linux下C 43 43 实现Http请求类 GET xff0c POST xff0c 上传 xff0c 下载 Http协议简述 协议 xff1a 网络协议的简称 xff0c 网络协议是通信计算机双方必须共同遵从的一组约定 如怎么样建立连
  • 正点原子MiniFly V1.2学习笔记四---txQueue队列数据哪来

    笔记二的第四点中 xff0c 把解包出来的指令发送到 rxQueue队列里 xff0c 然后从txQueue队列取数据发送到串口 那么txQueue队列的数据从哪里来的 一 txQueue数据从哪里来 xff1f 二 什么地方会调用radi
  • redis链接工具

    redis链接工具 今天推荐一款redis链接工具 xff0c 其实世面上连接redis的工具很多 xff0c 但是好用的很少 例如 xff1a redis desktop manager这款工具也不错 xff0c 但是我个人不能使用 xf
  • Linux 网络编程——UDP编程

    一 概述 UDP 是 User Datagram Protocol 的简称 xff0c 中文名是用户数据报协议 xff0c 是一个简单的面向数据报的运输层协议 xff0c 在网络中用于处理数据包 xff0c 是一种无连接的协议 UDP 不提
  • 给指定的寄存器地址:0x0001eea7 ,赋值

    coretexM0平台上给指定的寄存器地址 xff1a 0x0001eea7 赋值100 怎么实现 xff1f xff08 volatile char xff09 0x0001eea7 61 100 xff1b 常见错误1 xff1a xf
  • 常见cmake命令总结

    常见cmake命令总结 cmake常见命令 cmake minimum required 指定CMake的最小版本要求 cmake minimum required VERSION 2 8 project 定义工程名称 project PR
  • 利用Qt Phonon框架制作音视频播放器

    Phonon严格来说其实非为Qt的library xff0c Phonon原本就是KDE 4的开放源代码多媒体API xff0c 後来与Qt合并与开发 xff0c 所以简单来说就是Qt使用Phonon这个多媒体框架来提供一般影音多媒体档案的
  • 主设备号和次设备号

    Linux的设备管理是和文件系统紧密结合的 xff0c 各种设备都以文件的形式存放在 dev目录下 xff0c 称为设备文件 应用程序可以打开 关闭和读写这些设备文件 xff0c 完成对设备的操作 xff0c 就像操作普通的数据文件一样 为
  • Makefile中的wildcard用法

    在Makefile规则中 xff0c 通配符会被自动展开 但在变量的定义和函数引用时 xff0c 通配符将失效 这种情况下如果需要通配符有效 xff0c 就需要使用函数 wildcard xff0c 它的用法是 xff1a wildcard
  • GPIO

    一 什么是GPIO xff1f 首先应该理解什么是GPIO GPIO xff0c 英文全称为General Purpose IO ports xff0c 也就是通用IO口 在嵌入式系统中常常有数量众多 xff0c 但是结构却比较简单的外部设
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • vivi源代码最为详细分析(二)

    现在进入bootloader之vivi分析的第二阶段 xff0c 这部分使用C语言实现 xff0c 部分代码采取内嵌汇编的方式 这里需要用到GNU GCC内嵌汇编 的知识 xff0c 这部分基础还没有具备 xff0c 需要学习 下面先按照流
  • vivi源代码最为详细分析(三)

    step 5 xff1a MTD设备初始化 关于什么是MTD xff0c 为什么要使用MTD xff0c MTD技术的架构是什么 xff0c 等等 xff0c 可以参考 Linux MTD源代码分析 xff08 作者 xff1a Jim Z
  • 【笔记】docker-compose.yml 文件更改后重新启动加载更改后的内容

    docker compose yml 文件更改后想使之立刻生效 xff0c 但是不想手动删除已经建立的 container 等信息可以运行下面命令 重新创建容器实现修改 docker compose up force recreate d
  • bootloader开发阶段总结以及可能会碰到的问题

    到今天 xff0c vivi源代码基本分析完毕 对bootloader有了更深层的认识 在此期间 xff0c 仔细阅读了毛德操 胡希明先生编著的 嵌入式系统 采用公开源代码和StrongARM XScale处理器 第七章 xff1a 嵌入式
  • 用模式一实现用户登录功能

    login jsp为显示登录表单和处理登录请求的页面 xff0c 登录成功后跳转到logonSuccess jsp页面 xff0c 登录失败时重新显示登录表单和失败的帮助信息 xff0c 以便用户重新登录 xff1b 如果已登录用户再次访问
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序