从文件服务器向客户端发送文本时出现分段错误

时间:2013-08-27 10:32:42

标签: c segmentation-fault buffer

我目前仍在通过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文件将在以后用空格填充以进行编辑功能。

1 个答案:

答案 0 :(得分:1)

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

在执行阅读之前,您无需弄清楚文件的大小:

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

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