sendto : Resource temporarily unavailable (errno 11)

55,023

The error you are getting:

EAGAIN or EWOULDBLOCK: The socket is marked nonblocking and the requested operation would block. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities.

You set the socket to non-blocking (O_NONBLOCK). The socket is still busy sending the previous message. You cannot send another until the first has finished sending. That's why sleeping helped.

Don't set it to non-blocking, or try again after select says you can.

Share:
55,023
Jary
Author by

Jary

Updated on August 15, 2020

Comments

  • Jary
    Jary over 3 years

    I am having a problem with sendto.

    I have a receiver who receives UPD packets with recvfrom and then replies to the sender using sendto.

    Unfortunately, I am getting errno 11 (Resource temporarily unavailable). I am using two sockets.

    The first packet is actually sent but not the ones afterwards:

    sendto :: Success

    error: 0.

    sendto :: Resource temporarily unavailable

    error: 11.

    sendto :: Resource temporarily unavailable

    ...

    This is an extract of my code:

        int sockfd, sockSend;
    
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
                perror("socket");
    
        if ((sockSend = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
                perror("socket");
    
        if (fcntl(sockfd, F_SETOWN, getpid()) < 0) {
                perror("fcntl"); 
        }
        if (fcntl(sockfd, F_SETFL, O_RDONLY | O_NONBLOCK | FASYNC) < 0) {
                perror("fcntl"); 
        } 
    
        if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
                        < 0)
                perror("bind");
    

    And in a SIGIO handler:

        len = sizeof(recv_addr);
        char buffer[payload];
        bzero(buffer, payload);
        n = recvfrom(sockfd, buffer, payload, MSG_DONTWAIT, (struct sockaddr *)&recv_addr, &len);
    
        while (n > 0) {
    
                                sprintf(response, "%d\n%d\n%d\n", items, target_buf, pb_sp);          
                                sendto(sockSend, response, strlen(response), 0, (struct sockaddr *) &recv_addr, sizeof(recv_addr));
                                // sleep(1);
    
                                perror("sendto :");
                                printf("error: %d.\n", errno);
    
         }
    

    Could this issue come because the port is still hot, and I need to wait before reusing it? I've tried to change port but it hasn't helped.

    Update: If the sleep(1) is commented out, then the packets actually get send!

    Thanks a lot for your help.

  • Jary
    Jary about 13 years
    Thanks a lot. But O_NONBLOCK is for sockfd, shouldn't sockSend be blocking (default behavior)? I use sockfd to receive and sockSend to send data. I removed O_NONBLOCK in fcntl() and the same behavior occurs. This was what you were mentioning, right?
  • Jary
    Jary about 13 years
    By removing O_NONBLOCK AND also MSG_DONTWAIT it ends up working! Thank you very very much! Is there any way though to keep one socket blocking (Sending) and one non-blocking (for receiving) please?!