博客
关于我
Linux UDP C/S例子
阅读量:790 次
发布时间:2023-02-01

本文共 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;}

转载地址:http://yswfk.baihongyu.com/

你可能感兴趣的文章
Linux PS命令使用
查看>>
Linux ps命令,使用的好,效率爆棚!
查看>>
linux python版本升级_Linux下python2.x升级python3.7
查看>>
linux qt creator arm,Linux 下 PC 與 ARM 版 qt + opencv 環境搭建(Qt Creator)
查看>>
Linux questions
查看>>
LINUX REDHAT第十一单元练习题
查看>>
Linux rm 删除指定文件外的其他文件 方法汇总
查看>>
linux RPM manager
查看>>
Linux rpm软件包管理实战
查看>>
linux rsync配置文件参数详解
查看>>
Linux rsyslog 转存至日志服务器
查看>>
linux scp命令参数及用法详解--linux远程复制拷贝命令使用实例【转】
查看>>
Linux script命令记录(数据库)操作步骤
查看>>
linux sed 批量替换字符串
查看>>
linux sed命令 批量替换文件内容的方法
查看>>
Linux sed命令增删改查 附代码
查看>>
linux sed命令详解
查看>>
linux sed命令详解
查看>>
Linux Shell Shock漏洞利用和实战
查看>>
linux shell wc 命令
查看>>