使用C语言进行udp通信
一、概述
UDP协议简单介绍:
1.UDP协议是用户数据报协议,面向无连接的、不稳定、不可靠、不安全的数据报传递---更像是是收发短信。
2.UDP传输不需要建立连接,传输效率更高,在稳定的局域网内环境相对可靠
3.UDP天然支持多客户端
C语言UDP函数介绍:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 函数说明: 接收消息 参数说明: sockfd 套接字 buf 要接受的缓冲区 len 缓冲区的长度 flags 标志位 一般填0 src_addr 原地址 传出参数 addrlen 发送方地址长度 返回值 成功: 返回读到的字节数 失败: 返回 -1 设置errno 调用该函数相当于TCP通信的recv+accept函数 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); 函数说明: 发送数据 参数说明: sockfd 套接字 dest_addr 目的地址 addrlen 目的地址长度 返回值 成功: 返回写入的字节数 失败: 返回-1,设置errno
UDP通讯服务端具体步骤:
1.创建套接字,得到一个cfd
2.绑定端口
3.在while循环中收发数据 recvfrom/sendto
4.关闭套接字
UDP通讯客户端操作步骤:
1.创建一个套接字,得到一个cfd
2.在while循环中收发数据recvfrom /sendto
3.关闭套接字
二、代码示例
1.服务端代码
//udp服务端(udp天生支持多客户端) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <ctype.h> int main(int argc, char const *argv[]) { //1.创建socket int cfd = socket(AF_INET,SOCK_DGRAM,0); if(cfd<0){ perror("socket error"); return -1; } //绑定 struct sockaddr_in serv; struct sockaddr_in client; bzero(&serv,sizeof(serv)); serv.sin_family = AF_INET; serv.sin_port = htons(8888); serv.sin_addr.s_addr = htonl(INADDR_ANY); bind(cfd,(struct sockaddr *)&serv,sizeof(serv)); //3.循环读取读取客户端消息和给客户端回复消息 int i; int n; socklen_t len; char buf[1024]; while(1){ //4.读取数据 memset(buf,0x00,sizeof(buf)); len = sizeof(client); n = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&client,&len); //将大写转换为小写 for(i=0;i<n;i++){ buf[i] = toupper(buf[i]); } printf("[%d]:n=[%d],buf=[%s]\n",ntohs(client.sin_port),n,buf); //5.给客户端回复消息 sendto(cfd,buf,n,0,(struct sockaddr*)&client,len); } //关闭套接字 close(cfd); return 0; }
2.客户端代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <ctype.h> int main(){ //1.创建socket int cfd = socket(AF_INET,SOCK_DGRAM,0); if(cfd<0){ perror("socket error"); return -1; } int n ; char buf[1024]; struct sockaddr_in serv; serv.sin_family = AF_INET; serv.sin_port = htons(8888); inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr); while(1){ //读取标准输入数据 memset(buf,0x00,sizeof(buf)); n = read(STDIN_FILENO,buf,sizeof(buf)); //发送数据 sendto(cfd,buf,n,0,(struct sockaddr*)&serv,sizeof(serv)); //读取数据 memset(buf,0x00,sizeof(buf)); n = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL); printf("n=[%d],buf=[%s]\n",n,buf); } //关闭套接字 close(cfd); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探