0

我目前仍在通过 Ubuntu 用 C 语言编写一个简单的客户端-服务器应用程序。到目前为止,我的登录功能似乎运行良好(在客户端输入一些文本,从服务器中的文件中获取文本并验证),但是这个特殊的显示选项给我带来了麻烦。

服务器端代码的一些片段(我从另一个站点抓取文件复制到下面的缓冲区功能):

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

服务器可能会在缓冲区“Bflag”中存储类似“a< cr >< lf >”的内容。不好。应该会导致错误,但并不总是立即导致错误。

在阅读之前,您不需要弄清楚文件的大小:

只需发出:result = fread (buffer,1,BUFSIZE,userf); 现在,如果您的文件最终大于缓冲区,您的程序不会崩溃,但不会读取所有文件。您可以稍后更改您的工作程序以处理文件大于一个缓冲区的情况。使用“结果”(如果它大于零)作为要写入客户端的字节数。

如果您的文件(超过几个字节)大于 BUFSIZE,它可能会在您在第一个代码块中提供的函数退出时导致“分段错误”。我认为这就是您的分段错误的来源。

于 2013-08-27T13:12:09.213 回答