Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打开非阻塞UDP端口时打开文件失败_C_Sockets_File Io_Udp_Posix - Fatal编程技术网

C 打开非阻塞UDP端口时打开文件失败

C 打开非阻塞UDP端口时打开文件失败,c,sockets,file-io,udp,posix,C,Sockets,File Io,Udp,Posix,我的程序有问题。程序应该由UDP消息触发,这就是为什么我打开一个非阻塞UDP套接字,因为我想稍后再次使用它。在这之后,程序应该打开一个文件,复制出一定数量的字节并将其发送到浏览器 当我想打开一个文件时,就会出现“资源暂时不可用”错误 下面是一个简单的程序,它会产生相同的故障 主要部分: udp_openPort(9999); for(;;){ if(udp_receiveData(temp, 32) > 0){ printf("Received Message:

我的程序有问题。程序应该由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():

当我以阻塞套接字的形式打开套接字时,打开文件没有问题,但我需要使用非阻塞套接字

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

致以最良好的祝愿, 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;
}

可能有人在这里看到了问题。

您确定
打开
后的
错误
不会干扰
udp\u openPort
?可能是
udp\u openPort
出错,设置了
errno
变量,您最近将其误解为文件打开错误。

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


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

我编辑了我的帖子,并添加了udp_openPort()函数。udp_openPort函数不使用errno变量执行任何操作。如果出现错误,那么当我使用阻塞套接字时,问题可能也会出现。好的,这是有道理的。当我删除errno内容并使用返回的描述符进行错误处理时,一切正常。现在我知道为什么了,非常感谢!
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;
}