linux_c_udp_example

udp_server

复制代码
 1 #include <stdlib.h>
 2 #include <string.h>
 3 #include <unistd.h>
 4 #include <arpa/inet.h>
 5 #include <sys/socket.h>
 6 #include <stdio.h>
 7 
 8 #define BUF_SIZE 30
 9 
10 void err_handler(char *msg);
11 
12 int main(int argc, char **argv) {
13 
14     int srv_sock;
15     char msg[BUF_SIZE];
16     int str_len;
17     socklen_t cli_adr_sz;
18 
19     struct sockaddr_in srv_addr, cli_addr;
20     if (argc != 2) {
21         printf("Usage : %s <port>\n", argv[0]);
22         exit(1);
23     }
24     srv_sock = socket(PF_INET, SOCK_DGRAM, 0);
25     if (srv_sock == -1) {
26         err_handler("UDP socket() error");
27     }
28     memset(&srv_addr, 0, sizeof(srv_addr));
29     srv_addr.sin_family = AF_INET;
30     srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
31     srv_addr.sin_port = htons(atoi(argv[1]));
32 
33     if (bind(srv_sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -1) {
34         err_handler("bind() error");
35     }
36 
37     while (1) {
38         cli_adr_sz = sizeof(cli_addr);
39         str_len = recvfrom(srv_sock, msg, BUF_SIZE, 0, (struct sockaddr *) &cli_addr, &cli_adr_sz);
40         sendto(srv_sock, msg, str_len, 0, (struct sockaddr *) &cli_addr, cli_adr_sz);
41         printf("recv and send ...\n");
42     }
43 
44     close(srv_sock);
45     return 0;
46 }
47 
48 void err_handler(char *msg) {
49     fputs(msg, stderr);
50     fputc('\n', stderr);
51     exit(1);
52 }
View Code
复制代码

udp_client

复制代码
 1 #include <stdlib.h>
 2 #include <string.h>
 3 #include <unistd.h>
 4 #include <arpa/inet.h>
 5 #include <sys/socket.h>
 6 #include <stdio.h>
 7 
 8 #define BUF_SIZE 30
 9 
10 void err_handler(char *msg);
11 
12 int main(int argc, char **argv) {
13 
14     int sock;
15     char msg[BUF_SIZE];
16     int str_len;
17     socklen_t adr_sz;
18 
19     struct sockaddr_in srv_addr, from_addr;
20     if (argc != 3) {
21         printf("Usage : %s <IP> <PORT>\n", argv[0]);
22         exit(1);
23     }
24 
25     sock = socket(PF_INET, SOCK_DGRAM, 0);
26     if (sock == -1) {
27         err_handler("socket() error");
28     }
29 
30     memset(&srv_addr, 0, sizeof(srv_addr));
31     srv_addr.sin_family = AF_INET;
32     srv_addr.sin_addr.s_addr = inet_addr(argv[1]);
33     srv_addr.sin_port = htons(atoi(argv[2]));
34 
35     while (1) {
36         fputs("Input msg(Q to quit):", stdout);
37         fgets(msg, BUF_SIZE, stdin);
38         if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) {
39             break;
40         }
41         sendto(sock, msg, strlen(msg), 0, (struct sockaddr *) &srv_addr, sizeof(srv_addr));
42         adr_sz = sizeof(from_addr);
43         str_len = recvfrom(sock, msg, BUF_SIZE, 0, (struct sockaddr *) &srv_addr, &adr_sz);
44         msg[str_len] = 0;
45         printf("Msg form srv : %s", msg);
46     }
47     close(sock);
48     return 0;
49 }
50 
51 void err_handler(char *msg) {
52     fputs(msg, stderr);
53     fputc('\n', stderr);
54     exit(1);
55 }
View Code
复制代码

 build

gcc -o usrv udp_srv.c -g -Wall
gcc -o ucli udp_cli.c -g -Wall

posted @   NorseLZJ  阅读(223)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示