1

ゲームがコマンドを送信して新しいハイスコアを保存したり、トップ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");
}
4

1 に答える 1

1

大きな問題は、printf/perror がメッセージを出力するだけで、実行が継続することです (ゼロ化されたバッファーで...)。代わりにエラーを出力してから、ループから抜け出す/プログラムを終了する/適切なものは何でもする必要があります。そして、wildplasser が指摘したように、n==0 はエラーではありません。

それでもわからない場合は、短い自己完結型の正しい例を試してみてください。sscce を組み立てるだけで問題に気付くことが多いのは印象的です!

于 2012-11-07T21:36:14.973 に答える