-4

次のc ソケット プログラミング コードは、ファイル記述子からデータを取得するのを待たずに常にループしています。これは、サーバー側のソケット プログラミングの一部です。クライアントからの要求を受け入れるのを待っていません。助けてください。

コード:

while(1){  
  bzero(buffer,256);
  read(newsockfd,buffer,256);  
  printf("%s",buffer);  
  if(n<0){
    printf("reading client message failed\n");    
    return 0;
  }  
  printf("success\n");  

}  
4

1 に答える 1

1

read()の戻り値を変数に割り当てていませんが、いつ失敗したかを何らかの形で知るnことを期待しています。その割り当てを修正してから、ループロジックを修正して、実際に読み取られたバイトのみを出力するようにします。次に例を示します。nread()

while(1){  
  memset(buffer,0,256);
  printf("sssssssss\n");  
  n = read(newsockfd,buffer,256);
  if(n<0){
    // if your sockeet is non-blocking then uncomment this code...
    /*
    if ((errno == EAGAIN) || (errno == EWOULDBLOCK)){
        fd_set rfd;
        FD_ZERO(&rfd);
        FD_SET(newsockfd, &rfd);

        struct timeval timeout;
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;

        if (select(newsockfd+1, &rfd, NULL, NULL, &timeout) > 0){
            continue;
        }
    }
    */
    printf("reading client message failed\n");    
    return 0;
  }  
  if(n==0){
      break;
  }  
  printf("%.*s\n",n,buffer);  
  printf("succcccccccccccccc\n");  
}  
于 2013-01-15T19:10:04.217 に答える