ゲームがコマンドを送信して新しいハイスコアを保存したり、トップ10のスコアを取得したりできるハイスコアサーバーを使用して、プロジェクト用のゲームを作成しています。私が抱えている問題は、ゲームがサーバーにいくつかのコマンドを送信した後、それらが完全に正常に実行された後、ゲームが何も送信していないにもかかわらず、呼び出しread()
が受信し続けることです!!null
解決策を探し回ったところ、次のことを確認しましたが、問題ありません。
1- ソケットが作成されるif (sockfd==-1)
と、エラーを確認して出力し、終了します
2- すべてのソケットで明示的にブロッキング モードを有効にしました
3- すべてのソケットをテストしました
if(n < 0){
perror("Read Error:");
}
ここに入ることはありませんが、私はに変更しました
if(n == 0){
perror("Read Error:");
}
そして、私は悪いアドレスを取得します!! ゲームが実際に送信を実行するまで読み取り機能を待機させる方法について何か助けはありますか?
失敗する送信および読み取りコードは次のとおりです。
サーバ:
listen(sock, 5);
clientlength = sizeof(client_add);
newsock = accept(sock, (struct sockaddr *) &client_add, &clientlength);
if(newsock < 0){
printf("Couldn't accept\n");
}
while(1){
bzero(buffer, 300);
ioctl(newsock, FIONBIO, 0);
n= read(newsock, buffer, 299);
if(n == 0){
perror("Read Error:");
}
if(n<0){
printf("Error while reading from socket\n");
}
printf("Received: %s\n",buffer);
//send to function that processes the string
dothemagic(buffer);
}
送信されたメッセージの例:
strcpy(buffer, "gettop5");
n = write(sock,buffer,strlen(buffer));
if (n < 0){
printf("Writing to socket was unsuccessful\n");
}