当前位置:首页 > 系统教程 > 正文

Linux下UDP通信详解:从零开始掌握Socket编程流程

Linux下UDP通信详解:从零开始掌握Socket编程流程

本文将带你一步步了解在Linux系统中如何使用C++实现UDP通信,详细解析socket编程的完整流程。无论你是网络编程新手还是想巩固基础,都能从中获益。文中将穿插UDP通信Linux C++Socket编程网络编程四个核心关键词,帮助你快速掌握要点。

Linux下UDP通信详解:从零开始掌握Socket编程流程 UDP通信  Linux C++ Socket编程 网络编程 第1张

1. UDP与TCP的区别

UDP是面向无连接的传输层协议,不保证数据可靠到达,但传输速度快,适合实时性要求高的场景(如视频通话、游戏)。与之相对,TCP提供可靠连接,但开销较大。理解这些有助于你选择合适的协议进行网络编程

2. UDP通信流程概览

UDP通信分为服务端和客户端两端,基本流程如下:服务端:创建socket → 绑定地址 → 接收/发送数据 → 关闭socket客户端:创建socket → 发送/接收数据 → 关闭socket下图直观展示了这一流程:

3. 环境准备

确保你的Linux系统已安装g++编译器和基本开发库。可以通过命令sudo apt install g++(Debian/Ubuntu)或sudo yum install gcc-c++(CentOS)安装。后续所有示例均基于Linux C++环境。

4. 创建socket(socket函数)

使用socket()函数创建套接字:int sockfd = socket(AF_INET, SOCK_DGRAM, 0);AF_INET表示IPv4,SOCK_DGRAM表示UDP数据报。成功返回文件描述符,失败返回-1。这是Socket编程的第一步。

5. 绑定地址(bind函数)

服务端需要绑定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));客户端通常不需要绑定,系统会自动分配端口。

6. 发送数据(sendto函数)

sendto()用于发送UDP数据报:sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&destaddr, len);参数包括套接字、数据缓冲区、长度、标志、目标地址和地址长度。注意目标地址结构需要提前填充。

7. 接收数据(recvfrom函数)

recvfrom()接收数据并记录发送方地址:recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &len);返回接收到的字节数,通过cliaddr可以获取客户端信息,便于回复。

8. 关闭socket(close函数)

通信结束后调用close(sockfd)关闭套接字,释放资源。

9. 完整代码示例

服务端(server.cpp)

    #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;}  

客户端(client.cpp)

    #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;}  

10. 编译运行

分别编译两个文件:g++ server.cpp -o serverg++ client.cpp -o client先运行服务端./server,再运行客户端./client,即可看到通信结果。这展示了完整的UDP通信流程。

11. 总结

本文详细介绍了在Linux下使用C++进行UDP socket编程的每一步,从创建socket到关闭,并给出了完整示例。掌握这些基础后,你可以进一步探索多线程、超时控制等高级主题,深入网络编程的世界。

—— 教程结束 ——