0

問題が何であるかを教えてくれるvalgrindをインストールしますが、残念ながら、このコンピューターには新しいプログラムをインストールできません...この「エコー」プログラムに明らかな問題があるかどうか、誰か教えてもらえますか? 友人のためにこれを行っているので、反対側のクライアントのレイアウトはわかりませんが、読み取りと書き込みの両方が有効なソケット記述子であることはわかっており、n = write(writes,"私はあなたのメッセージ \n",20); n = write(reads,"メッセージを受け取りました \n",20); どちらも機能するため、無効な fd の場合ではないことを確認できます。ありがとう!

int
main( int argc, char** argv ) {


 int reads = atoi(argv[1]) ; 
 int writes = atoi(argv[3]) ; 
 int n ; 


  char buffer[MAX_LINE];
  memset(buffer, 0, sizeof(buffer));



  int i = 0 ; 
  while (1) {
    read(reads, buffer, sizeof(buffer));
    n = write(writes,buffer,sizeof(buffer));
    if (n < 0)  perror("ERROR reading from socket"); 

  } 
4

4 に答える 4

1

次の 2 行は非常に疑わしいように見えます。

int reads = atoi(argv[1]) ; 
int writes = atoi(argv[3]) ; 

コマンドラインでファイル/ソケット記述子番号を本当に取得しますか? どこから?

と の戻り値を確認し、次に - の値を確認するread(2)と、おそらくファイル記述子が無効であることがわかります ( )。write(2)errno(3)EBADF

于 2012-07-24T15:09:36.230 に答える
1

これまでに指摘されていない点が 1 つあります。ファイル記述子が有効であることはわかっていますが、コマンド ラインのサニティ チェックを含める必要があります。

if (argc < 3) {
       printf("usage: foo: input output\n");
       exit(0);
}

このサニティ チェックを使用しても、コマンド ラインでこのようなパラメーターを渡すことは危険な場合があります。

于 2012-07-24T18:00:10.693 に答える
1

いくつかの問題がありますが、最も差し迫った問題は、書き込み時に sizeof(buffer) を使用して書き込みソケットにガベージ データをプッシュしている可能性が高いことです。読み取りソケットからデータを読み取り、それが MAX_LINES 未満であるとしましょう。そのデータを書き込もうとすると、読み取ったものに加えて、バッファの最後にガベージを書き込むことになります (最初に memset を設定したとしても、異なる読み取りサイズに反応せずに同じバッファを継続的に使用すると、おそらくいくつかのゴミ。

read から戻り値を取得し、それを書き込みで使用してみてください。読み取りの戻り値がエラーを示している場合は、プログラムをどのように動作させたいかに応じて、クリーンアップして終了するか、再試行してください。

int n, size;
while (1) {
   size = read(reads, buffer, sizeof(buffer));

   if (size > 0) {
       n = write(writes, buffer, size);

       if (n != size) {
           // write error, do something
       }  
   } else {
       // Read error, do something
   }
}

もちろん、これは書き込みと読み取りが有効なファイル記述子であることを前提としています。

于 2012-07-24T15:00:15.230 に答える
0
  1. 以下memset()を変更すれば、 は必要ありません (ただし、変更する必要があります)。
  2. read()結果があり、実際にどれだけ読んだかがわかります。これはwrite()、ゼロ化の必要をなくして、実際に持っているものだけを書き込むために与える必要があります。
  3. MAX_LINEそれ以上ではないにしても、少なくとも 512 である必要があります。

おそらく他にもいくつかの問題がありますが、私は最も重要なものを持っていると思います。

于 2012-07-24T14:39:21.680 に答える