繁体   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