簡體   English   中英

sendto:資源暫時不可用(錯誤11)

[英]sendto : Resource temporarily unavailable (errno 11)

我遇到了sendto的問題。

我有一個接收器接收帶有recvfrom的UPD數據包,然后使用sendto回復發送者。

不幸的是,我得到了錯誤11(資源暫時不可用)。 我正在使用兩個插座。

第一個數據包實際上是發送但后來沒有發送:

sendto ::成功

錯誤:0。

sendto ::資源暫時不可用

錯誤:11。

sendto ::資源暫時不可用

...

這是我的代碼的摘錄:

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

在SIGIO處理程序中:

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

     }

這個問題可能是因為端口仍然很熱,我需要等待才重新使用它嗎? 我試圖改變端口,但它沒有幫助。

更新:如果睡眠(1)被注釋掉,那么數據包實際上會被發送!

非常感謝你的幫助。

你得到的錯誤:

EAGAIN或EWOULDBLOCK:套接字標記為非阻塞,請求的操作將被阻止。 POSIX.1-2001允許在這種情況下返回錯誤,並且不要求這些常量具有相同的值,因此便攜式應用程序應檢查這兩種可能性。

您將套接字設置為非阻塞(O_NONBLOCK)。 套接字仍在忙於發送上一條消息。 在第一次完成發送之前,您無法發送另一個。 這就是睡眠有幫助的原因。

不要將其設置為非阻塞,或者在select之后再嘗試。

如果你必須將套接字設置為非阻塞,你可以使用select安全地(並且只有?)這樣做:

select()pselect()允許程序監視多個文件描述符,等待一個或多個文件描述符變為“准備好”某些類的I / O操作(例如,輸入可能)。 如果可以在不阻塞的情況下執行相應的I / O操作(例如,讀取(2)),則認為文件描述符就緒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM