繁体   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