在 Linux 中,可以使用套接字(socket)的超時機制來設置連接、讀取和寫入操作的超時時間。以下是如何為不同類型的套接字設置超時機制的示例:
#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;
}
// ...
// 設置發送超時
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
perror("setsockopt");
close(sockfd);
return 1;
}
// ... 進行其他操作
// ...
// 設置接收和發送超時
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)。