溫馨提示×

linux socket 怎樣設(shè)置超時機制

小樊
81
2024-10-09 08:51:37
欄目: 智能運維

在 Linux 中,可以使用套接字(socket)的超時機制來設(shè)置連接、讀取和寫入操作的超時時間。以下是如何為不同類型的套接字設(shè)置超時機制的示例:

  1. 設(shè)置接收超時(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; // 設(shè)置超時時間為 5 秒
    timeout.tv_usec = 0;

    // 設(shè)置接收超時
    if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
        perror("setsockopt");
        close(sockfd);
        return 1;
    }

    // 連接到遠(yuǎn)程服務(wù)器
    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. 設(shè)置發(fā)送超時(SO_SNDTIMEO):
// ...

// 設(shè)置發(fā)送超時
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
    perror("setsockopt");
    close(sockfd);
    return 1;
}

// ... 進行其他操作
  1. 設(shè)置接收和發(fā)送超時(SO_RCVTIMEO 和 SO_SNDTIMEO):
// ...

// 設(shè)置接收和發(fā)送超時
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO | SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
    perror("setsockopt");
    close(sockfd);
    return 1;
}

// ... 進行其他操作

注意:上述示例中的超時時間是以秒為單位的。如果需要以毫秒為單位設(shè)置超時時間,可以將 tv_usec 字段設(shè)置為相應(yīng)的毫秒數(shù)(例如,1000 毫秒 = 1 秒,所以 tv_usec 應(yīng)設(shè)置為 1000000)。

0