我遇到sendto問題。sendto:資源暫時不可用(errno 11)
我有一個接收方用recvfrom接收UPD數據包,然後用sendto回覆發送方。
不幸的是,我越來越errno 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)被註釋掉,那麼數據包實際上會發送!
非常感謝您的幫助。
您使用的兩個插槽具有相同的端口?如果是這樣,原因是什麼? – penguin359 2011-04-20 22:47:36
也許'SO_REUSEADDR'會有所幫助。或者您可以保持端口開放而不是打開和關閉端口,或者每次都可以使用新的隨機分配的端口號。 – 2011-04-20 22:52:02
我已添加更多代碼。我有2個套接字,但只有一個綁定到一個端口(接收特定端口上的數據),另一個可以從任何端口發送數據。 – Jary 2011-04-20 22:53:31