C++开发揭秘:TCP超时等待机制及实战示例
在TCP/IP协议中,超时等待是一种网络协议机制,用于处理网络连接中的数据传输问题。当一个TCP连接的一方在一定时间内没有收到对方的响应时,它会进入超时等待状态,然后尝试重新发送数据包。 在C++开发中,我们可以使用socket API来实现TCP的超时等待。以下是一个简单的示例: ```cpp #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <netdb.h> int main() { int sockfd; struct sockaddr_in serv_addr; struct hostent *server; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Error opening socket"); exit(EXIT_FAILURE); } server = gethostbyname("www.example.com"); if (server == NULL) { perror("Error getting host"); exit(EXIT_FAILURE); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(80); if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("Error connecting"); exit(EXIT_FAILURE); } // 设置超时等待时间为5秒 struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; // 设置socket的超时等待选项 if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) { perror("Error setting timeout"); exit(EXIT_FAILURE); } // 发送数据 send(sockfd, "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"), 0); // 接收数据 char buffer[1024]; int bytes_received = recv(sockfd, buffer, sizeof(buffer), 0); if (bytes_received < 0) { perror("Error receiving"); exit(EXIT_FAILURE); } printf("Received %d bytes: %s\n", bytes_received, buffer); close(sockfd); return 0; } ``` 在这个示例中,我们首先创建了一个socket,然后使用gethostbyname函数获取了www.example.com的IP地址。然后,我们使用connect函数连接到服务器。接着,我们设置了socket的超时等待选项,使其在5秒后超时。我们发送了一个HTTP请求,并接收了服务器的响应。 注意,setsockopt函数的第二个参数是SO_RCVTIMEO,表示接收超时。如果在指定的时间内没有接收到数据,那么函数将返回-1,并设置errno为ETIMEDOUT。 ######[AI写代码神器 | 645点数解答 | 2023-11-09 00:41:43]
- 按键精灵实现:按F9启动,循环三次F2、X操作后再按F9的代码揭秘 (DeepSeek | 276点数解答 | 2025-02-23 00:05:43)278
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)24
- Java 状态模式:模拟 TCP 连接多种状态及行为转换(GPT | 2147点数解答 | 2024-12-19 22:19:37)290
- Java实现状态模式:模拟TCP连接状态管理及行为处理(GPT | 1541点数解答 | 2024-12-19 22:19:57)280
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)266
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)263
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)394
- 深入解析Golang Work Stealing机制:多核处理器工作负载平衡之道(百度文心 | 391点数解答 | 2023-11-09 18:16:09)293
- 深入剖析Go语言:揭秘Go Hand Off机制及示例演示 (百度文心 | 413点数解答 | 2023-11-09 18:16:10)249
- 苍溪县 2026 全民阅读周:协同发力,书香满城展成效(字节豆包 | 862点数解答 | 2026-03-11 10:27:57)18
- iOS开发必知:TCP与UDP协议的差异及应用解析(阿里通义 | 222点数解答 | 2023-11-08 00:41:42)267
- Linux 开发必备:多种方法查看 HTTP 并发请求数与 TCP 连接状态及工具局限分析 (百度文心 | 447点数解答 | 2023-11-09 18:48:12)300