Errno:11,资源暂时不可用

时间:2012-11-25 19:37:01

标签: c sockets udp

我正在使用c套接字来实现可靠的UDP协议。我正在使用以下代码在我正在等待确认的套接字上设置超时。我不知道为什么我得到错误11,资源暂时不可用。

        //set timer for recv_socket
        struct timeval tv;
        tv.tv_usec = TIMEOUT_MS;

        if(setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0){
            printf("Error setting the socket timeout.\n");
        }

        int recv_msg_len;
        if(recv_msg_len = recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
               (struct sockaddr *) &servAddr2, &fromSize) < 0){
            //timeout reached
            printf("Error Reporting: %d : %s\n", errno, strerror(errno));
            num_timeouts++;
        }

我也尝试过评论中提到的select方法。我在循环中有以下代码,但是recvfrom永远不会超时。

        fd_set set;
        FD_ZERO(&set);      /* empties the set */
        FD_CLR(rcv_sock,&set);    /* removes FD from the set */
        FD_SET(rcv_sock,&set);    /* adds FD to the set */

        if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){
            printf("\nError Reporting: %d : %s\n\n", errno, strerror(errno));
            return -1;
        }


        if(!FD_ISSET(rcv_sock,&set)){   /* true if FD is in the set */
            printf("socket is not set properly.\n");
        }

2 个答案:

答案 0 :(得分:13)

在阻止套接字上调用recvfrom()并使用setsockopt()设置超时时,如果调用EAGAIN (11)次,则会收到错误recvfrom(),这是正常的out(即:在指定为超时的时间段内未收到任何数据)。

man recvfrom逐字逐句

  

返回值

     

...

     

<强>错误

     

...   

     

EAGAIN或EWOULDBLOCK                 套接字标记为非阻塞,接收操作将阻塞,或已设置接收超时并且   超时在收到数据之前过期。 ...

要解决此问题:只需再次致电recvfrom () ......; - )

答案 1 :(得分:0)

对我来说,问题是由于ipV6数据包到达绑定到特定端口的UDP套接字。这些是触发select()但是当我尝试使用recvfrom()读取它们时,调用返回&#34;资源暂时不可用&#34;。我的应用程序不需要IPV6,所以我只是通过sysctl.conf禁用它。问题现在消失了!