服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言详解UDP通信的实现

C语言详解UDP通信的实现

2022-11-21 15:23liufeng2023 C/C++

UDP协议是用户数据报协议,面向无连接的、不稳定、不可靠、不安全的数据报传递---更像是是收发短信;UDP传输不需要建立连接,传输效率更高,在稳定的局域网内环境相对可靠;UDP天然支持多客户端

UDP通信

C语言详解UDP通信的实现

UDP服务端创建的socket是直接用来通信的套接字,没有类似TCP一样创建一个监听的socket。

UDP相关函数:

#include <sys/types.h>
#include <sys/socket.h>
注意:send和recv用于TCP; sendto和recvfrom用于UDP。

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr,                     socklen_t addrlen);
    - 参数:
        - sockfd : 通信的fd
        - buf : 要发送的数据
        - len : 发送数据的长度
        - flags : 0        --一般不会用它
        - dest_addr : 通信的另外一端的地址信息
        - addrlen : 地址的内存大小
    - 返回值:
        - 成功: 返回发送字节的数量
        - 失败: -1,并设置错误号

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t                         *addrlen);
    - 参数:
        - sockfd : 通信的fd
        - buf : 接收数据的数组
        - len : 数组的大小
        - flags : 0
        - src_addr : 用来保存另外一端的地址信息,不需要可以指定为NULL
        - addrlen : 地址的内存大小
    - 返回值:
        - 成功: 返回发送字节的数量
        - 失败: -1,并设置错误号
 

UDP客户端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//UDP_Client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main() {
    // 1.创建一个通信的socket, 注意第二个参数是:SOCK_DGRAM,数据报的协议。
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }  
    // 服务器的地址信息
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr);    --地址为服务器的地址
    int num = 0; 
    // 3.通信
    while(1) {
        // 发送数据
        char sendBuf[128];
        sprintf(sendBuf, "hello , i am client %d \n", num++);
        sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&saddr, sizeof(saddr));
        // 接收数据
        int num = recvfrom(fd, sendBuf, sizeof(sendBuf), 0, NULL, NULL);    --服务端默认是通过saddr回数据,默认NULL即可。
        printf("server say : %s\n", sendBuf);
        sleep(1);
    }
    close(fd);
    return 0;
}

UDP服务端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//UDP_Server
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main() {
    // 1.创建一个通信的socket, 注意第二个参数是:SOCK_DGRAM,数据报的协议。
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }  
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;  --服务器绑定本机所有的网卡
    // 2.绑定
    int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    if(ret == -1) {
        perror("bind");
        exit(-1);
    }
    // 3.通信
    while(1) {
        char recvbuf[128];
        char ipbuf[16];
        struct sockaddr_in cliaddr;
        int len = sizeof(cliaddr);  --用来保存客户端的地址
        // 接收数据
        int num = recvfrom(fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&cliaddr, &len);
        printf("client IP : %s, Port : %d\n",
            inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
            ntohs(cliaddr.sin_port));   --ip和端口号, 从网络字节序转换成主机字节序
         
        // 发送数据
        sendto(fd, recvbuf, strlen(recvbuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
    }
    close(fd);
    return 0;
}

结果运行:

客户端:

C语言详解UDP通信的实现

服务端:

C语言详解UDP通信的实现

问:UDP能不能再开一个客户端连接服务端?

答案:可以。

到此这篇关于C语言详解UDP通信使用的文章就介绍到这了,更多相关C语言UDP通信内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Edward_LF/article/details/124561168

延伸 · 阅读

精彩推荐
  • C/C++C++中的const的使用详解

    C++中的const的使用详解

    这篇文章主要介绍了 C++中的const的使用详解的相关资料,需要的朋友可以参考下...

    hungryof4162021-05-10
  • C/C++C++实现学生选课系统

    C++实现学生选课系统

    这篇文章主要为大家详细介绍了C++实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    transportation1118612021-07-22
  • C/C++C++关键字typename的深入理解

    C++关键字typename的深入理解

    本篇文章是对C++中的关键字typename进行了详细的分析介绍,需要的朋友参考下...

    C++教程网4322020-12-14
  • C/C++C++实现LeetCode(692.前K个高频词)

    C++实现LeetCode(692.前K个高频词)

    这篇文章主要介绍了C++实现LeetCode(692.前K个高频词),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang8412021-12-14
  • C/C++C++德州扑克的核心规则算法

    C++德州扑克的核心规则算法

    德州扑克想必很多人都玩过,当然对于新手需要说明的是,德州指的是德克萨斯州,而不是山东德州。分享下在计算最大牌型,比牌逻辑的算法和洗牌的方...

    C++教程网11092021-03-30
  • C/C++C++实现简单班级成绩管理系统

    C++实现简单班级成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    唐纳特8422022-10-08
  • C/C++C++实现二分法的一些细节(常用场景)

    C++实现二分法的一些细节(常用场景)

    二分法算法思想首先确定有根区间,将区间二等分,通过判断f(x)的符号,逐步将有根区间缩小,直至有根区间足够小,便可求出满足精度要求的近似值...

    ZhiboZhao10772021-11-22
  • C/C++深入理解线程安全与Singleton

    深入理解线程安全与Singleton

    在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance...

    C语言教程网10472020-12-30