0

私は現在、Ubuntuを介してCで単純なクライアントサーバーアプリケーションをプログラミングしています。これまでのところ、私のログイン機能はうまく機能しているように見えます (クライアントにテキストを入力し、サーバーのファイルからテキストを取得して確認します) が、この特定の表示オプションが問題を引き起こしています。

サーバー側コードの一部のスニペット (別のサイトから以下の file copy to buffer 関数を取得しました):

char bflag[1]; //mainmenu option recveived from client
 char buffer[BUFSIZE+1]; //BUFSIZE is 1024
 long lSize;
 size_t result;

 FILE * userf;
 userf = fopen("Books.txt", "r+b");

 recv(new_sockfd, bflag, BUFSIZE, 0); //receive flag from clientside

 if ( (strncmp (bflag, "a", 1)) == 0) //display flag received
 {
  fseek (userf , 0 , SEEK_END);
  lSize = ftell (userf);
  rewind (userf);

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,userf);

  send(new_sockfd, buffer, BUFSIZE, 0);

 }
fclose(userf);

クライアント側では、さまざまなオプションにスイッチを使用します。

char bbuf[BUFSIZE+1]; //BUFSIZE is 1024

switch (mmenuc)
{
 case 1:
{
 strcpy (mmenuf, "a"); 
 send (sockfd, mmenuf, BUFSIZE,0);//send flag 'a' to server

 system("clear");
 printf("Listing of books available:\n");
 printf("O = Available    X = Unavailable\n");
 printf("\n");

 recv (sockfd, bbuf, BUFSIZE,0);
 printf ("%s", bbuf);

 printf("\n");

 getchar(); //eats the "\n" 
 getchar(); //to pause
 break;
}

私が今直面している問題は、ファイル内のすべてのテキストが取得され、クライアント側の端末に正常に表示されることですが、サーバー側の端末ではセグメンテーション違反が発生します。どこかでバッファオーバーフローが発生していると思いますが、何が原因なのかわかりません。また、Books.txt ファイルには、後で編集するためのスペースが埋め込まれます。

4

1 に答える 1

1

サーバーはおそらく「a< cr >< lf >」のようなものをバッファ「Bflag」に保存します。良くない。エラーが発生するはずですが、すぐにエラーが発生するとは限りません。

読み取りを行う前に、ファイルのサイズを把握する必要はありません。

次を発行してください: result = fread (buffer,1,BUFSIZE,userf); これで、ファイルがバッファよりも大きくなっても、プログラムはクラッシュしませんが、すべてのファイルを読み取るわけではありません。ファイルが 1 つのバッファよりも大きい場合を処理するために、後で作業プログラムを変更できます。クライアントに書き込むバイト数には「result」(ゼロより大きい場合) を使用します。

ファイルが (数バイト以上) BUFSIZE より大きい場合、最初のコードブロックで指定した関数の終了時に「セグメンテーション フォールト」が発生する可能性があります。それがあなたのセグメンテーション違反の原因だと思います。

于 2013-08-27T13:12:09.213 に答える