繁体   English   中英

标志MSG_ERRQUEUE是否使套接字在Linux上具有非阻塞行为?

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

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已经用C语言编写了一个程序,用于发送icmp echo请求,然后接收icmp echo答复。 我试图在我的recvmsg()函数调用上添加标志MSG_ERRQUEUE,但是它产生的行为好像我使用的套接字是非阻塞的。

我已经验证过,并且没有在程序中的任何地方将套接字设置为非阻塞状态,也没有在发送和/或接收时设置超时(SO_RCVTIMEO / SO_SNDTIMEO)。

这是我的代码:

getaddrinfo

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");
}

sendto()/ 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();
         }
    }

如果cmsg->cmsg_type == IP_RECVERR则在函数retrieve_info()中,我使用struct sock_extended_err *来存储有关错误的信息

在recvmsg()调用中使用了这两个标志后,我在每次调用时都出现了一个EAGAIN错误!

谢谢

问题暂未有回复.您可以查看右边的相关问题.
1 带有MSG_ERRQUEUE的Linux UDP套接字recvmsg

为了在套接字X上使用sendto()发送时获得ICMP错误(例如,目标未到达),可以使用MSG_ERRQUEUE标志在该套接字X上调用recvmsg。 (作业系统= Linux) 我将此套接字X与端口Y绑定在一起,但无法接收具有端口Y和sendto()生成的ICMP错误的udp数据包。 ...

2 从带有MSG_ERRQUEUE标志的recvmsg中读取ICMP有效负载

我正在使用BSD套接字构建不需要root特权(例如tracepath)的高级traceroute程序。 使用UDP和绑定套接字,我称: 我收到有关先前发送的数据包已触发的假定的ICMP通知的信息。 您知道是否可以访问ICMP有效负载(应该是先前发送的数据包)吗? 我从recvm ...

3 Linux非阻塞套接字

您好,我想用openSSL覆盖层实现非阻塞TCP套接字。 目前,我使用epoll,但是没有其他方法(轮询或选择除外)吗? 是否可以将回调函数与描述符关联? 我阅读了一些有关libaio ,但我不完全知道它可以做什么... ...

4 是否有可能(并且安全)使接受套接字成为非阻塞的?

我正在寻找一种方法来中断阻塞套接字上的accept()调用。 使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。 使用select()是另一种选择,由于各种原因 buf 在我的情况下不是很吸引人。 如果可能的话,最好从另一个线程将套接字设置为非阻塞模式(使用fcntl()和O_NONB ...

5 Linux,套接字,非阻塞连接

我想创建一个非阻塞连接。 像这样: 为此,我使用了另一个线程、一个无限循环和 Linux epoll。 像这样(伪代码): 如果我先运行服务器,然后运行客户端,则一切正常。 如果我首先运行客户端,稍等片刻,运行服务器,则客户端无法连接。 我究竟做错了什么? 也许它可以以不同的方式完成? ...

6 异步,非阻塞套接字行为 - WSAEWOULDBLOCK

我继承了两个应用程序,一个在Windows 7 PC上运行的Test Harness(一个客户端)和一个在Windows 10 PC上运行的一个服务器应用程序。 我试图使用TCP / IP套接字在两者之间进行通信。 客户端将请求(对于XML形式的数据)发送到服务器,然后服务器将请求的数据(也 ...

8 具有非阻塞套接字的多线程

我正在尝试使用nio在Java中实现TCP服务器。 它只是使用Selector的select方法来获取就绪键。 然后处理这些密钥,如果它们是可接受的,可读的等等。 服务器工作正常,直到我使用单个线程。 但是当我试图使用更多的线程来处理密钥时,服务器的响应变慢并最终停止响应,比如说4-5个 ...

9 具有c的双向套接字(非阻塞)

我尝试通过TCP套接字进行某种聊天。 服务器端在php中实现,并且(应该)工作正常。 不,我在客户端遇到问题(在c [c99]中实现): 我想从服务器监听(读取)“新字节”,并且每当用户输入新数据时,我也想向服务器发送(写入)“一些字节”。 现在的问题是:-&gt;我如何侦听 ...

10 具有TCP的非阻塞套接字

我正在使用Java非阻塞套接字和TCP编写程序。 我知道TCP是一种流协议,但是底层IP协议使用数据包。 当我调用SocketChannel.read(ByteBuffer dst)时,是否总是获得IP数据包的全部内容? 还是可以终止于数据包中间的任何位置? 这很重要,因为我试图通过 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM