簡體   English   中英

標志 MSG_ERRQUEUE 是否使套接字在 linux 上具有非阻塞行為?

[英]Is flag MSG_ERRQUEUE make socket having a non-blocking behavior on linux?

我在 C 中編寫了一個程序,用於發送 icmp echo 請求,然后接收 icmp echo 回復。 我試圖在我的 recvmsg() function 調用上添加標志 MSG_ERRQUEUE,但它產生的行為好像我使用的套接字是非阻塞的。

我已經驗證並且我沒有在程序的任何地方將套接字設置為非阻塞,並且我沒有設置發送和/或接收超時(SO_RCVTIMEO/SO_SNDTIMEO)。

這是我的代碼:

獲取地址信息

void get_addr()
{
    struct addrinfo hints;
    int ret;

    bzero(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_RAW;
    hints.ai_protocol = IPPROTO_ICMP;

    if ((ret = getaddrinfo(env.args.hostname, NULL, &hints, &(env.addr))) != 0)
        error_exit("getaddrinfo");
}

套接字設置

void set_socket()
{
    int on;
    int ttl;

    if ((env.sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
        error_exit("socket creation");

    env.ttl = 64;
    if ((setsockopt(env.sockfd, 0, IP_TTL, &(env), sizeof(env))) < 0)
        error_exit("socket TTL setup");

    on = 1;
    if ((setsockopt(env.sockfd, 0, IP_RECVERR, &(on), sizeof(on))) < 0)
        error_exit("socket RECVERR setup");

    on = 1;
    if ((setsockopt(env.sockfd, 0, IP_RECVTTL, &(on), sizeof(on))) < 0)
        error_exit("socket RECVTTL setup");
}

發送到()/recvmsg()

    int main()
    {
         int retsend;
         int retrecv;

         while (1)
         {
             if ((retsend = sendto(env.sockfd, &(env.icmp_req), sizeof(env.icmp_req), 0, (env.addr->ai_addr), env.addr->ai_addrlen)) < 0)
                 perror("Error sendto: ");
             if ((recvmsg(env.sockfd, &(env.r_data.msg), MSG_WAITALL | MSG_ERRQUEUE)) < 0)
                 perror("Error recvmsg: ");
             retrieve_info();
         }
    }

在 function retrieve_info()中,我使用struct sock_extended_err *來存儲有關錯誤的信息,如果cmsg->cmsg_type == IP_RECVERR

使用 recvmsg() 調用中的這兩個標志,我在每次調用時都會遇到 EAGAIN 錯誤!

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM