【问题标题】:Open a file fails when nonblocking UDP port is open打开非阻塞 UDP 端口时打开文件失败
【发布时间】:2013-10-31 12:36:33
【问题描述】:

我的程序有问题。该程序应该由UDP消息触发,这就是我打开一个非阻塞UDP套接字的原因,因为我想稍后再使用它。之后程序应该打开一个文件,复制出一定数量的字节并将其发送到浏览器。

当我想打开一个文件时出现问题,然后我得到一个“资源暂时不可用”的错误。

这是一个简单的程序,它会产生同样的故障。

主要部分:

udp_openPort(9999);

for(;;){
    if(udp_receiveData(temp, 32) > 0){
        printf("Received Message: %d\n",atoi(temp));
    break;
    }
} 

filefd = open("test.txt",O_RDONLY);
printf("File Open: %s\n",strerror(errno));

read(filefd,buff,sizeof(buff));

printf("Daten: %s",buff);

close(filefd);

udp_closePort();

udp_receiveData():

int udp_receiveData(void* data, int size){
    socklen_t dummy = sizeof(NetworkAddr);
    NetworkAddr sender;
    return recvfrom(sockfd, data, size, MSG_DONTWAIT, (struct sockaddr*) (&sender), &dummy);
}

当我将套接字作为阻塞套接字打开时,打开文件没有问题,但我需要非阻塞套接字。

是我在编写程序时犯了错误,还是在计划程序时犯了错误?

最好的问候, PG

编辑:这里是 udp_openPort() 函数:

int udp_openPort(int portNr){

//Create handle to socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1){
    return 0;
}

// Make sure that we don't receive our own packets.
char loop = 0;
if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) == -1){

}


// Bind to the port where we receive UDP messages.
NetworkAddr addr;
memset(&addr, 0, sizeof(addr));

addr.sin_family      = AF_INET;
addr.sin_port        = htons(portNr);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

if (bind(sockfd, (struct sockaddr*) &addr, sizeof(addr)) == -1){
    return 0;
}
return 1;
}

也许有人在这里看到了问题。

【问题讨论】:

    标签: c sockets file-io udp posix


    【解决方案1】:

    查看open 的联机帮助页,当且仅当错误发生时设置errno,即当返回描述符为-1 时。因此,您的错误处理不正确。您应该检查filefd 的值以确定文件是否已打开。

    因为文件实际上是正确打开的,所以errno没有被修改,你的错误信息是udp_receiveData设置的;在这种情况下,由于您的套接字是非阻塞的,UDP 套接字上没有数据(资源暂时不可用)。使用阻塞套接字时您不会遇到这种情况,因为您的程序正在休眠等待消息到达。

    【讨论】:

    • 好的,有道理。当我删除 errno-stuff 并使用返回的描述符进行错误处理时,一切正常。现在我知道为什么了,非常感谢!
    【解决方案2】:

    你确定你erroropen之后不会干扰udp_openPort吗?可能udp_openPort 做错了什么并设置了您最近误解为文件打开错误的errno 变量。

    【讨论】:

    • 我编辑了我的帖子并添加了 udp_openPort() 函数。 udp_openPort 函数不对 errno 变量做任何事情。如果错误存在,那么当我使用阻塞套接字时也可能会出现问题。
    猜你喜欢
    • 2013-12-10
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多