本文介绍了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)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-10 18:16