1. ホーム
  2. c

[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない

2022-02-19 02:49:46

質問

cソケットを使用して、信頼性の高いUDPプロトコルを実装しています。 以下のコードを使用して、確認応答を待っているソケットにタイムアウトを設定しています。 なぜ errno 11, resource temporarily unavailable が発生するのかよくわかりません。

        //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() を使用してタイムアウトが設定されている場合、ブロッキングソケット上で setsockopt() というエラーが発生するのは正常です。 EAGAIN (11)

recvfrom()

man recvfrom

recvfrom ()

エラー

... .

EAGAINまたはEWOULDBLOCK ソケットがノンブロッキングであり、受信動作がブロックされる。 または受信タイムアウトが設定されていて データを受信する前にタイムアウトが発生した . ...

これを回避するために を呼び出すだけです。 もう一度 ... ;-)