我的程序有问题。程序应该由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;
}
也许有人在这里看到了问题。
答案 0 :(得分:1)
您确定error
之后的open
不会干扰udp_openPort
吗?可能udp_openPort
做错了,并设置了最近误解为文件打开错误的errno
变量。
答案 1 :(得分:1)
查看open
的联机帮助页,当{且仅当错误发生时,即返回的描述符为errno
时,-1
被设置。因此,您的错误处理不正确。您应该检查filefd
的值,以确定文件是否已被打开。
由于文件实际上已正确打开,因此errno
尚未修改,您的错误消息由udp_receiveData
设置;在这种情况下,由于您的套接字是非阻塞的,因此UDP套接字上没有数据(资源暂时不可用)。你没有遇到阻塞套接字,因为你的程序正在等待消息到达。