Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 错误号:11,资源暂时不可用_C_Sockets_Udp - Fatal编程技术网

C 错误号:11,资源暂时不可用

C 错误号:11,资源暂时不可用,c,sockets,udp,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){

我正在使用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");
        }
在阻塞套接字上调用recvfrom时,如果调用recvfrom超时(即:在指定为超时的时间段内未收到任何数据),并且已使用setsockopt设置超时,则获取错误EAGAIN 11是正常的

man recvfrom的逐字记录:

返回值

错误

。。。

伊根或伊沃块 套接字标记为非阻塞,接收操作将阻塞,或者设置了接收超时,并且 接收数据之前超时已过期


要解决这个问题:只需再次调用recvfrom-

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

尝试改用选择和非阻塞套接字。select方法更加灵活、可靠和可移植。在第二个代码段中不需要调用recvfrom int。recvfrom返回ssize_t not int,顺便说一句。答案很棒!非常感谢。