我目前仍在通过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文件将在以后用空格填充以进行编辑功能。
答案 0 :(得分:1)
服务器可能存储类似“a< cr>< lf>”的内容在缓冲区“Bflag”中。不好。应该导致错误,但并不总是立即引起错误。
在执行阅读之前,您无需弄清楚文件的大小:
刚发出:result = fread(buffer,1,BUFSIZE,userf); 现在,如果您的文件最终大于缓冲区,您的程序将不会崩溃但只是不读取所有文件。您可以稍后更改您的工作程序,以处理文件大于一个缓冲区的情况。使用“result”(如果它大于零)表示要写入客户端的字节数。
如果您的文件(大于几个字节)大于BUFSIZE,则在退出您在第一个代码块中提供的函数时,可能会导致“分段错误”。我认为这就是你的分段错误来自哪里。