0

プログラムに問題があります。プログラムは 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;
}

多分誰かがここで問題を見つけます。

4

2 に答える 2