本文介绍了SENDTO:资源暂时不可用(错误11)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个的sendto问题。
我有谁与recvfrom的UPD接收数据包,然后接收器使用的sendto回复给发件人。
不幸的是,我得到错误号11(资源暂时不可用)。我用的两个插槽。
第一个数据包实际发送,但不是那些算账:
SENDTO ::成功
错误:0
SENDTO ::资源暂时不可用
错误:11
SENDTO ::资源暂时不可用
...
这是我的code的摘录:
INT的sockfd,sockSend; 如果((的sockfd =插座(AF_INET,SOCK_DGRAM,0))小于0)
PERROR(插座); 如果((sockSend =插座(AF_INET,SOCK_DGRAM,0))小于0)
PERROR(插座); 如果(的fcntl(的sockfd,F_SETOWN,GETPID())小于0){
PERROR(的fcntl);
}
如果(的fcntl(的sockfd,F_SETFL,O_RDONLY | O_NONBLOCK | FASYNC)小于0){
PERROR(的fcntl);
} 如果(绑定(的sockfd,(结构sockaddr *)及serv_addr,sizeof的(serv_addr))
< 0)
PERROR(绑定);
而在一个SIGIO处理程序:
LEN = sizeof的(recv_addr);
字符缓冲区[负载]
bzero(缓冲,有效载荷);
N = recvfrom的(的sockfd,缓冲,有效载荷,MSG_DONTWAIT,(结构sockaddr *)及recv_addr,和放大器; LEN); 而(N 0){ sprintf的(回应,%d个\\ n%d个\\ n%d个\\ N,物品,target_buf,pb_sp);
SENDTO(sockSend,响应,strlen的(响应),0,(结构sockaddr *)及recv_addr,sizeof的(recv_addr));
//睡眠(1); PERROR(SENDTO:);
的printf(错误:%d个\\ n,错误号); }
难道这个问题来,因为港口仍然是热的,我需要重新使用之前要等待?我试图更改端口,但它并没有帮助。
更新:如果睡眠(1)已被注释掉,则数据包实际获得发送
非常感谢你的帮助。
解决方案
你所得到的错误:
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.
这篇关于SENDTO:资源暂时不可用(错误11)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!