linux UDP 通信

UDP:

复制代码
#include <sys/types.h>
#include <sys/socket.h>
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 : 发送数据的长度
        - flag : 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 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5 #include <string.h>
 6 
 7 int main() 
 8 {
 9     //创建socket
10     int fd = socket(PF_INET, SOCK_DGRAM, 0);
11     if(fd == -1) 
12     {
13         perror("socket");
14         return -1;
15     }
16     //服务器的地址信息
17     struct sockaddr_in saddr;
18     saddr.sin_family = AF_INET;
19     saddr.sin_port = htons(9999);
20     inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr);
21     int num = 0;
22     //通信
23     while(1) 
24     {
25         char sendbuf[128];
26         sprintf(sendbuf, "hello, i am client %d\n",num++);
27         //发送数据
28         sendto(fd, sendbuf, strlen(sendbuf) + 1, 0, (struct sockaddr *)&saddr, sizeof(saddr));
29         // 接收
30         int num = recvfrom(fd, sendbuf, sizeof(sendbuf), 0, NULL, NULL);
31         printf("server say: %s\n",sendbuf);
32         sleep(1);
33     }
34     close(fd);
35     return 0;
36 }
复制代码

UDP服务器端:

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <string.h>
 5 #include <arpa/inet.h>// #include <sys/types.h>  #include <sys/socket.h>
 6 
 7 int main()
 8 {
 9     //1.创建一个通信socket
10     int fd = socket(PF_INET, SOCK_DGRAM, 0);
11     if(fd == -1)
12     {
13         perror("socket");
14         exit(-1);
15     }
16     struct sockaddr_in addr;
17     addr.sin_family = AF_INET;
18     addr.sin_port = htons(9999);
19     addr.sin_addr.s_addr = INADDR_ANY;
20     //2.绑定
21     int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
22     if(ret == -1)
23     {
24         perror("bind");
25         exit(-1);
26     }
27     //3.通信
28     while(1)
29     {
30         char recvbuf[128];
31         char ipbuf[16];
32         struct sockaddr_in cliaddr;
33         int len = sizeof(cliaddr);
34         //接收数据
35         int num =recvfrom(fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&cliaddr, &len);
36         if(num == -1)
37         {
38             perror("recvfrom");
39             exit(-1);
40         }
41         printf("client IP : %s, Port: %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr,ipbuf, sizeof(ipbuf)),ntohs(cliaddr.sin_port));
42         printf("client say : %s\n", recvbuf);
43         //发送数据
44         sendto(fd, recvbuf, strlen(recvbuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
45     }
46     close(fd);
47     return 0;
48 }
复制代码

 

posted on   廿陆  阅读(20)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示