网络编程:UDP协议

发布时间:2026/9/27 5:52:57
网络编程:UDP协议 一、是什么UDPUser Datagram Protocol用户数据报协议是一种简单的、无连接的传输层协议用于在网络中传输数据。与 TCP 不同UDP 不提供可靠性、顺序性和流量控制但它具有低延迟和高效的特点适合对实时性要求较高的应用。UDP 是一种无连接协议客户端和服务器之间不需要建立连接即可发送数据。它的核心功能是快速传输数据包。二.UDP 数据包结构UDP 数据包由以下部分组成源端口发送方的端口号。目的端口接收方的端口号。长度数据包的总长度包括头部和数据。校验和用于检测数据包是否损坏可选。数据实际传输的数据三、编程1.socket与TCP相同2.socket之后直接收发1发送ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);功能:sendto 将数据发送到指定的地址中通过sockfd参数:sockfd --- 表示socket对应的fdbuf --- 存放数据的一块内存空间len --- 表示要发送的字节数flags --- 发送的标志 MSG_DONWAIT //非阻塞 --- 不在等 0 ---默认方式dest_addr --- 目标地址 --- 代表要发送到的目的地址addrlen --- 代表 目标地址数据的长度 sizeof(dest_addr)返回值:成功 返回发送出去的字节数 失败 -1 errno被设置2接收ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);功能:从socket中接收消息参数:sockfd --- 表示socket对应的fdbuf --- 存放数据的一块内存空间len --- 表示打算读取的字节数flags --- 读取的标志 MSG_DONWAIT //非阻塞 --- 不在等src_addr --- 表示数据的源地址addrlen --- 源地址大小值结果参数ocklen_t addrlen sizeof(src_addr);返回值:成功 返回读取到的字节数 失败 -1 errno被设置客户端#include stdio.h #include sys/types.h /* See NOTES */ #include sys/socket.h #include netinet/in.h #include netinet/ip.h /* superset of previous */ #include strings.h #include string.h #include arpa/inet.h int main(int argc, const char *argv[]) { int clifd socket(AF_INET,SOCK_DGRAM,0); if (clifd 0) { perror(socket fail); return -1; } //bind //sendto 鍑芥暟 char buf[1024] hello udp!\n; struct sockaddr_in seraddr; bzero(seraddr,sizeof(seraddr)); seraddr.sin_family AF_INET; seraddr.sin_addr.s_addr inet_addr(127.0.0.1); seraddr.sin_port htons(50000); sendto(clifd,buf,strlen(buf)1,0,(const struct sockaddr *)seraddr,sizeof(seraddr)); return 0; }服务器#include stdio.h #include sys/types.h /* See NOTES */ #include sys/socket.h #include netinet/in.h #include netinet/ip.h /* superset of previous */ #include strings.h #include arpa/inet.h int main(int argc, const char *argv[]) { int serfd socket(AF_INET,SOCK_DGRAM,0); if (serfd 0) { perror(socket fail); return -1; } //bind struct sockaddr_in seraddr; bzero(seraddr,sizeof(seraddr)); seraddr.sin_family AF_INET; seraddr.sin_addr.s_addr INADDR_ANY; seraddr.sin_port htons(50000); if (bind(serfd,(const struct sockaddr*)seraddr,sizeof(seraddr)) 0) { perror(bind fail); return -1; } //recvfrom 鍑芥暟 char buf[1024]; struct sockaddr_in srcaddr; socklen_t len sizeof(srcaddr); recvfrom(serfd,buf,sizeof(buf),0,(struct sockaddr*)srcaddr,len); printf(-------------------\n); printf(ip %s\n,inet_ntoa(srcaddr.sin_addr)); printf(port %d\n,ntohs(srcaddr.sin_port)); printf(buf %s\n,buf); return 0; }

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询