-1

宿題のためにCでクライアント/サーバープログラムを書こうとしています。何が起こるか:接続が確立されますサーバーはクライアントがメッセージを送信するのを待ちますクライアントはユーザーにメッセージを要求し、それを文字列に割り当ててからサーバーに送信します。これは、クライアントの次のコードで実行されます。

while(1){
/* prepare message */
    printf ("Please enter the message: ");
    bzero (buffer, BUFFERLENGTH); //BUFFERLENGTH is defined as 256
    fgets (buffer, BUFFERLENGTH, stdin);
/* send message */
    n = write (sockfd, buffer, strlen(buffer));
    if (n < 0) 
         error ("ERROR writing to socket");
    bzero (buffer, BUFFERLENGTH);
}

今、私の問題は、このコードが少しぎこちないものを送信していることです。私の知る限り、バッファが空になっていないか、常にBUFFERLENGTHの長さであるとは限らないので、ランダムなジャンクがスタックから読み取られていますか?

サーバーはメッセージを受信し、それを印刷します。クライアントプログラムがスキャンインする"actual string I input"と、サーバーは次のようなものを出力します。

actual string I input @&^%~&ただし、端末出力は印刷不可能な文字でいっぱいであり、改行もあります。サーバーのコードは次のとおりです。

n = read (*newsockfd, buffer, BUFFERLENGTH -1);
printf("buffer = %s\n",buffer);
if (n < 0) 
    error ("ERROR reading from socket");

ただし、whileループを削除しても、これは発生しません。

bzeroについて読んだことがありますが、非推奨であることがわかっているので、memsetを使用する必要があります。しかし、私はそれを試してみました:memset(buffer,0,BUFFERLENGTH); そして問題はまだ起こります。

バッファにジブリッシュが追加されている理由の説明はありますか?


編集

バッファはクライアントで次のように宣言されます:char buffer[BUFFERLENGTH]; `

4

1 に答える 1

1

printf("%s", ...)0で終了する文字列が必要です。

0したがって、受け取ったバッファの最後にを追加する必要があります。

アップデート:

バッファが次のように定義されていると仮定します。

char buffer[BUFFERLENGTH];

最後の配列エントリにを追加する0には、次のようにします。

buffer[BUFFERLENGTH - 1] = 0;

より一般的なアプローチは、(よりコストがかかりますが)読み取る前に受信バッファー全体をゼロにすることです。

memset(buffer, 0, BUFFERLENGTH);
n = read (*newsockfd, buffer, BUFFERLENGTH - 1);
if (n < 0) 
  error ("ERROR reading from socket");
else
  printf("buffer = %s\n", buffer);
于 2012-10-27T16:34:49.563 に答える