
Linux UDP C/S例子
发布日期:2025-04-06 07:12:20
浏览次数:6
分类:精选文章
本文共 2311 字,大约阅读时间需要 7 分钟。
UDP C/S 编程
UDP 的工作模式与 TCP 有明显的区别。在 UDP 编程中,服务器端不需要设置监听(Listen)和等待连接(Accept)的过程,而客户端也不需要主动连接到服务器端。
UDP通信的特点是不可靠且面向“无连接”(Unreliable)。发送的数据无法确切知道对方是否收到,即使对方并不存在,也可以自由发送数据。这使得 UDP通信适用于对可靠性和安全性要求不高的场景,比如语音通信(用户可以根据语音内容选择是否发送)。
以下是一个简单的 UDP 服务器示例:
#include#include #include #include #include #include #include int main(int argc, char **argv) { if (argc != 2) { printf("Usage: %s port\n", argv[0]); exit(1); } printf("Welcome! This is a UDP server, ready to receive messages.\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(strtoimax(argv[1], NULL, 10)); addr.sin_addr.s_addr = htonl(INADDR_ANY); int sock; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } char buffer[512]; struct sockaddr_in client_addr; int len = sizeof(client_addr); while (1) { int n = recvfrom(sock, buffer, 511, 0, (struct sockaddr *)&client_addr, &len); if (n > 0) { printf("%s:%u says: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer); n = sendto(sock, buffer, n, 0, (struct sockaddr *)&client_addr, sizeof(client_addr)); if (n < 0) { perror("sendto"); break; } } else { perror("recv"); break; } } return 0;}
UDP客户端示例:
#include#include #include #include #include #include #include int main(int argc, char **argv) { if (argc != 3) { printf("Usage: %s ip port\n", argv[0]); exit(1); } printf("This is a UDP client.\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(strtoimax(argv[2], NULL, 10)); addr.sin_addr.s_addr = inet_addr(argv[1]); if (addr.sin_addr.s_addr == INADDR_NONE) { printf("Incorrect IP address!\n"); close(sock); exit(1); } char buffer[512]; int len = sizeof(addr); while (1) { gets(buffer); int n = sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)&addr, sizeof(addr)); if (n < 0) { perror("sendto"); close(sock); break; } n = recvfrom(sock, buffer, 512, 0, (struct sockaddr *)&addr, &len); if (n > 0) { printf("Received: %s\n", buffer); } else if (n == 0) { printf("Server closed\n"); break; } else if (n == -1) { perror("recvfrom"); break; } } return 0;}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月19日 10时54分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LinkSage:基于 GNN 的 Pinterest理解
2023-01-31
LinkWeChat,唯一以开源为核心的SCRM
2023-01-31
link和@import的区别
2023-01-31
link和Import区别
2023-01-31
link标签的rel属性
2023-01-31
Linly-Talker智能数字人实时对话系统如何部署体验
2023-01-31
Linq DataTable Group By 分组显示人员明细
2023-01-31
LINQ to DB 开源项目教程
2023-01-31
Linq to Entities不识别方法
2023-01-31
linq to entity常用操作
2023-01-31
linq to js使用汇总
2023-01-31
Linq to object 技巧、用法集锦
2023-01-31
LINQ to Objects---立即执行的Enumerable类方法
2023-01-31
linq to sql 三层架构中使用CRUD操作
2023-01-31
LINQ Tutorial for Beginners
2023-01-31
Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
2023-01-31
Linq 合并多个查询条件
2023-01-31
LINQ 左连接, 右连接, 全连接扩展
2023-01-31