在 Linux 中,可以使用套接字(socket)的超时机制来设置连接、读取和写入操作的超时时间。以下是如何为不同类型的套接字设置超时机制的示例:
- 设置接收超时(SO_RCVTIMEO):
#include#include #include #include #include int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); return 1; } struct timeval timeout; timeout.tv_sec = 5; // 设置超时时间为 5 秒 timeout.tv_usec = 0; // 设置接收超时 if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { perror("setsockopt"); close(sockfd); return 1; } // 连接到远程服务器 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); close(sockfd); return 1; } // ... 进行其他操作 close(sockfd); return 0; }
- 设置发送超时(SO_SNDTIMEO):
// ... // 设置发送超时 if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { perror("setsockopt"); close(sockfd); return 1; } // ... 进行其他操作
- 设置接收和发送超时(SO_RCVTIMEO 和 SO_SNDTIMEO):
// ... // 设置接收和发送超时 if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO | SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { perror("setsockopt"); close(sockfd); return 1; } // ... 进行其他操作
注意:上述示例中的超时时间是以秒为单位的。如果需要以毫秒为单位设置超时时间,可以将 tv_usec
字段设置为相应的毫秒数(例如,1000 毫秒 = 1 秒,所以 tv_usec
应设置为 1000000)。