2013-12-16 47 views
3

我在寫一個簡單的客戶端服務器程序。我的服務器收到一條消息並將其打印到stdout中。收到消息的客戶端分段錯誤

客戶端代碼:

... 
int message_length = strlen(message); 
sent_bytes = send(socket, &message_length, sizeof(int), 0); 
<... check ...> 
sent_bytes = send(socket, message, strlen(message)*sizeof(char), 0); 
<... check ...> 
... 

Server代碼:

... 
got_bytes = recv(socket, &message_length, sizeof(int), 0); 
<... check ...> 
message = malloc((message_length+10)*sizeof(char)); 
got_bytes = recv(socket, &message, message_length*sizeof(char), 0); 
<... check ...> 
printf("Length: %d\n", message_length); 
strcat(message, '\0'); 
printf("%s\n", message); 
... 

執行:

$ ./client Message! 

$ ./server 
Length: 8 
Segmentation fault 

這究竟是爲什麼?

+0

消息最初是以null結尾的嗎?嘗試用'message [message_length] = 0'代替strcat。或者讓客戶端發送帶有\ 0的消息作爲數據包的一部分。 – Ryan

回答

4

問題的癥結就在這裏:strcat(message, '\0');

strcat接受兩個字符串作爲參數,並\0不是一個字符串,它是一個字符。此外,如果message尚未用\0以空終止,則strcat將失敗,因爲它將尋找到message的末尾尋找空終止符,以便找出在哪裏追加右側變元。所以,即使strcat(message, "")也不行。

對您來說可能是正確的解決方案如下:在客戶端部分,更改send部分發送​​字節。假設生成message時,message在客戶端得到空終止,這將導致send操作發送空終止符,並且它將被服務器接收。然後,您可以完全擺脫strcat(message, '\0')片段。

編輯:您還需要將服務器部分調整爲recvmessage的一個額外字節,以獲得空終止符。

+0

非常感謝,現在一切正常! – user2342835