一、前言二、UDP Server 通信流程三、完整代码实现四、代码解析五、运行与测试六、总结七、结尾一、前言大家好这里是Hello_Embed。前几篇我们完成了 TCP 的服务端与客户端编程本篇开始学习UDP 通信。UDP 是无连接的传输协议流程比 TCP 更简单但需要注意收发函数的使用方式有所不同。UDP 通信程序代码实现可以结合之前的 TCP 代码以及流程图对比学习有助于加深理解。二、UDP Server 通信流程UDP Server 端只需四个步骤比 TCP 少了listen和accept步骤函数说明1socket创建套接字2bind绑定 IP、Port3recvfrom / sendto收发数据4close关闭套接字与 TCP 最大的区别UDP 无需建立连接直接收发数据使用recvfrom和sendto替代recv和send。三、完整代码实现#define_WIN32_WINNT0x0600#includeiostream#includeWinSock2.h#includews2tcpip.h#pragmacomment(lib,Ws2_32.lib)#definePORT8888intmain(){WSADATA wsa;intiSocketServer;structsockaddr_intSocketServerAddr;structsockaddr_intSocketClientAddr;intmsg_cnt0;characRecvBuf[1000];if(WSAStartup(MAKEWORD(2,2),wsa)!0)return-1;//第一步创建socketiSocketServer(int)socket(AF_INET,SOCK_DGRAM,0);tSocketServerAddr.sin_familyAF_INET;tSocketServerAddr.sin_porthtons(PORT);tSocketServerAddr.sin_addr.s_addrINADDR_ANY;memset(tSocketServerAddr.sin_zero,0,sizeof(tSocketServerAddr.sin_zero));//第二步绑定socketintiRetbind(iSocketServer,(conststructsockaddr*)tSocketServerAddr,sizeof(structsockaddr));if(-1iRet){printf(bind error\n);return-1;}//第三步接收数据while(1){intiAddrLensizeof(tSocketClientAddr);intiRecvLenrecvfrom(iSocketServer,acRecvBuf,sizeof(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);if(iRecvLen0){acRecvBuf[iRecvLen]\0;charip[20];inet_ntop(AF_INET,tSocketClientAddr.sin_addr,ip,sizeof(ip));printf(Get Msg From %s:%d\n,ip,acRecvBuf);//回复snprintf(acRecvBuf,1000,Get_Msg %d,msg_cnt);iAddrLensizeof(tSocketClientAddr);sendto(iSocketServer,acRecvBuf,strlen(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);}}//第四步关闭socketclosesocket(iSocketServer);return0;}四、代码解析1. 创建 UDP 套接字iSocketServer(int)socket(AF_INET,SOCK_DGRAM,0);与 TCP 的区别SOCK_STREAM改为SOCK_DGRAM表示使用 UDP 数据报模式。2. 绑定地址tSocketServerAddr.sin_addr.s_addrINADDR_ANY;bind(iSocketServer,(conststructsockaddr*)tSocketServerAddr,sizeof(structsockaddr));INADDR_ANY表示监听本机所有网卡的数据绑定失败时返回 -1。3. 接收数据recvfromintiRecvLenrecvfrom(iSocketServer,acRecvBuf,sizeof(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);recvfrom与recv的区别recvfrom会同时获取发送方的 IP 和端口保存在tSocketClientAddr中这是 UDP 回复数据的关键。4. 回复数据sendtosnprintf(acRecvBuf,1000,Get_Msg %d,msg_cnt);sendto(iSocketServer,acRecvBuf,strlen(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);sendto需要指定目标地址这里直接使用recvfrom获取到的客户端地址进行回复实现收到即回复的效果。五、运行与测试UDP 模式下测试更简单无需手动建立连接运行udp_server_test.exe打开 SSCOM选择UDP 模式端口设置为8888直接发送数据即可无需点击连接依次发送123与abc进行测试通信正常UDP 不需要像 TCP 那样先建立连接只需保持端口一致8888即可直接通信这正是 UDP 无连接特性的体现。六、总结SOCK_DGRAM创建 UDP 套接字的关键参数recvfrom接收数据的同时获取发送方地址sendto向指定地址发送数据UDP 无需listen/accept/connect流程比 TCP 更简洁七、结尾本篇实现了 UDP Server 端程序下一篇将学习UDP 客户端编程完成 UDP 通信的完整闭环。Hello_Embed继续带你从原理到实践掌握嵌入式上位机开发的核心技能敬请关注
嵌入式上位机开发入门(五):UDP 编程 —— Server 端实现
发布时间:2026/5/24 7:06:06
一、前言二、UDP Server 通信流程三、完整代码实现四、代码解析五、运行与测试六、总结七、结尾一、前言大家好这里是Hello_Embed。前几篇我们完成了 TCP 的服务端与客户端编程本篇开始学习UDP 通信。UDP 是无连接的传输协议流程比 TCP 更简单但需要注意收发函数的使用方式有所不同。UDP 通信程序代码实现可以结合之前的 TCP 代码以及流程图对比学习有助于加深理解。二、UDP Server 通信流程UDP Server 端只需四个步骤比 TCP 少了listen和accept步骤函数说明1socket创建套接字2bind绑定 IP、Port3recvfrom / sendto收发数据4close关闭套接字与 TCP 最大的区别UDP 无需建立连接直接收发数据使用recvfrom和sendto替代recv和send。三、完整代码实现#define_WIN32_WINNT0x0600#includeiostream#includeWinSock2.h#includews2tcpip.h#pragmacomment(lib,Ws2_32.lib)#definePORT8888intmain(){WSADATA wsa;intiSocketServer;structsockaddr_intSocketServerAddr;structsockaddr_intSocketClientAddr;intmsg_cnt0;characRecvBuf[1000];if(WSAStartup(MAKEWORD(2,2),wsa)!0)return-1;//第一步创建socketiSocketServer(int)socket(AF_INET,SOCK_DGRAM,0);tSocketServerAddr.sin_familyAF_INET;tSocketServerAddr.sin_porthtons(PORT);tSocketServerAddr.sin_addr.s_addrINADDR_ANY;memset(tSocketServerAddr.sin_zero,0,sizeof(tSocketServerAddr.sin_zero));//第二步绑定socketintiRetbind(iSocketServer,(conststructsockaddr*)tSocketServerAddr,sizeof(structsockaddr));if(-1iRet){printf(bind error\n);return-1;}//第三步接收数据while(1){intiAddrLensizeof(tSocketClientAddr);intiRecvLenrecvfrom(iSocketServer,acRecvBuf,sizeof(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);if(iRecvLen0){acRecvBuf[iRecvLen]\0;charip[20];inet_ntop(AF_INET,tSocketClientAddr.sin_addr,ip,sizeof(ip));printf(Get Msg From %s:%d\n,ip,acRecvBuf);//回复snprintf(acRecvBuf,1000,Get_Msg %d,msg_cnt);iAddrLensizeof(tSocketClientAddr);sendto(iSocketServer,acRecvBuf,strlen(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);}}//第四步关闭socketclosesocket(iSocketServer);return0;}四、代码解析1. 创建 UDP 套接字iSocketServer(int)socket(AF_INET,SOCK_DGRAM,0);与 TCP 的区别SOCK_STREAM改为SOCK_DGRAM表示使用 UDP 数据报模式。2. 绑定地址tSocketServerAddr.sin_addr.s_addrINADDR_ANY;bind(iSocketServer,(conststructsockaddr*)tSocketServerAddr,sizeof(structsockaddr));INADDR_ANY表示监听本机所有网卡的数据绑定失败时返回 -1。3. 接收数据recvfromintiRecvLenrecvfrom(iSocketServer,acRecvBuf,sizeof(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);recvfrom与recv的区别recvfrom会同时获取发送方的 IP 和端口保存在tSocketClientAddr中这是 UDP 回复数据的关键。4. 回复数据sendtosnprintf(acRecvBuf,1000,Get_Msg %d,msg_cnt);sendto(iSocketServer,acRecvBuf,strlen(acRecvBuf),0,(structsockaddr*)tSocketClientAddr,iAddrLen);sendto需要指定目标地址这里直接使用recvfrom获取到的客户端地址进行回复实现收到即回复的效果。五、运行与测试UDP 模式下测试更简单无需手动建立连接运行udp_server_test.exe打开 SSCOM选择UDP 模式端口设置为8888直接发送数据即可无需点击连接依次发送123与abc进行测试通信正常UDP 不需要像 TCP 那样先建立连接只需保持端口一致8888即可直接通信这正是 UDP 无连接特性的体现。六、总结SOCK_DGRAM创建 UDP 套接字的关键参数recvfrom接收数据的同时获取发送方地址sendto向指定地址发送数据UDP 无需listen/accept/connect流程比 TCP 更简洁七、结尾本篇实现了 UDP Server 端程序下一篇将学习UDP 客户端编程完成 UDP 通信的完整闭环。Hello_Embed继续带你从原理到实践掌握嵌入式上位机开发的核心技能敬请关注