[英]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.