2013-08-27 100 views
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文件稍後用空格填充用於編輯功能。

+1

什麼是例如'mmenuf'?如果它是例如'char mmenuf [1];'那麼你有一個緩衝區溢出。 –

+2

文件大小是多少? –

+1

另外,您不會將'bbuf'數組作爲一個字符串終止,因此打印它將繼續打印。而且您不會檢查是否有錯誤'recv'。 –

回答

1

服務器可能在緩衝區「Bflag」中存儲類似「a < cr> < lf>」的內容。不好。應該引起錯誤,但並不總是立即引起錯誤。

你並不需要弄清楚你的文件的大小,你讀前:

只是問題:結果= FREAD(緩衝區,1,BUFSIZE,userf); 現在,如果您的文件最終大於緩衝區,您的程序將不會崩潰,但不會讀取所有文件。稍後可以更改您的工作程序,以處理文件大於一個緩衝區的情況。使用「結果」(如果它大於零)要寫入客戶端的字節數。

如果您的文件比BUFSIZE大(超過幾個字節),它可能會導致您在第一個代碼塊中提供的函數退出時出現「分段錯誤」。我認爲這就是你的分段錯誤來自哪裏。

相關問題