本文将带你一步步了解在Linux系统中如何使用C++实现UDP通信,详细解析socket编程的完整流程。无论你是网络编程新手还是想巩固基础,都能从中获益。文中将穿插UDP通信、Linux C++、Socket编程、网络编程四个核心关键词,帮助你快速掌握要点。
UDP是面向无连接的传输层协议,不保证数据可靠到达,但传输速度快,适合实时性要求高的场景(如视频通话、游戏)。与之相对,TCP提供可靠连接,但开销较大。理解这些有助于你选择合适的协议进行网络编程。
UDP通信分为服务端和客户端两端,基本流程如下:服务端:创建socket → 绑定地址 → 接收/发送数据 → 关闭socket客户端:创建socket → 发送/接收数据 → 关闭socket下图直观展示了这一流程:
确保你的Linux系统已安装g++编译器和基本开发库。可以通过命令sudo apt install g++(Debian/Ubuntu)或sudo yum install gcc-c++(CentOS)安装。后续所有示例均基于Linux C++环境。
使用socket()函数创建套接字:int sockfd = socket(AF_INET, SOCK_DGRAM, 0);AF_INET表示IPv4,SOCK_DGRAM表示UDP数据报。成功返回文件描述符,失败返回-1。这是Socket编程的第一步。
服务端需要绑定IP和端口:struct sockaddr_in servaddr;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(8888);bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));客户端通常不需要绑定,系统会自动分配端口。
sendto()用于发送UDP数据报:sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&destaddr, len);参数包括套接字、数据缓冲区、长度、标志、目标地址和地址长度。注意目标地址结构需要提前填充。
recvfrom()接收数据并记录发送方地址:recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &len);返回接收到的字节数,通过cliaddr可以获取客户端信息,便于回复。
通信结束后调用close(sockfd)关闭套接字,释放资源。
#include #include #include #include #include #include int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return 1; } struct sockaddr_in servaddr, cliaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8888); if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind"); close(sockfd); return 1; } char buffer[1024]; socklen_t len = sizeof(cliaddr); int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&cliaddr, &len); buffer[n] = "�"; std::cout << "收到:" << buffer << " 来自 " << inet_ntoa(cliaddr.sin_addr) << std::endl; const char* reply = "Hello, client!"; sendto(sockfd, reply, strlen(reply), 0, (struct sockaddr*)&cliaddr, len); close(sockfd); return 0;} #include #include #include #include #include #include int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return 1; } struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8888); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); const char* msg = "Hello, server!"; sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&servaddr, sizeof(servaddr)); char buffer[1024]; socklen_t len = sizeof(servaddr); int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&servaddr, &len); buffer[n] = "�"; std::cout << "服务端回复:" << buffer << std::endl; close(sockfd); return 0;} 分别编译两个文件:g++ server.cpp -o serverg++ client.cpp -o client先运行服务端./server,再运行客户端./client,即可看到通信结果。这展示了完整的UDP通信流程。
本文详细介绍了在Linux下使用C++进行UDP socket编程的每一步,从创建socket到关闭,并给出了完整示例。掌握这些基础后,你可以进一步探索多线程、超时控制等高级主题,深入网络编程的世界。
—— 教程结束 ——
本文由主机测评网于2026-02-21发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260226335.html