linux socket 怎样设置超时机制

avatar
作者
筋斗云
阅读量:0

在 Linux 中,可以使用套接字(socket)的超时机制来设置连接、读取和写入操作的超时时间。以下是如何为不同类型的套接字设置超时机制的示例:

  1. 设置接收超时(SO_RCVTIMEO):
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h>  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; } 
  1. 设置发送超时(SO_SNDTIMEO):
// ...  // 设置发送超时 if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {     perror("setsockopt");     close(sockfd);     return 1; }  // ... 进行其他操作 
  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)。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!