[英]Recv call get empty data
我正在學習在c中使用套接字。 這是我的代碼:
void work_with_client(int client_sock){
char buff[10] = {0};
while(1){
kv_log_message("\tWork with client\n");
int is_received = recv(client_sock, buff, 10, 0);
if(is_received < 0){
perror("Received failed");
} else {
printf("RESPONSE: %s\n", buff);
}
printf("RESPONSE %d\n", is_received);
sleep(1);
}
}
當我通過telnet連接到該服務器並立即斷開連接時,服務器將打印以下行:
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 10
Work with client
RESPONSE:
RESPONSE 1
Work with client
RESPONSE:
RESPONSE 0
Work with client
而且我不明白為什么前4個recv
調用會獲得完整大小的緩沖區數據(從客戶端的角度來看,我沒有向套接字寫入任何內容)。 有什么建議么? PS在Mac OS X Yosemite上運行
更新:我在Linux上測試我的程序,在我的情況下,recv調用總是返回0,因此可能是Mac OS X上telnet中的問題
當recv()
返回0
這表明另一端關閉了連接。
從man recv
:
返回值
[...]當對等方執行有序關閉時,返回值將為0。
然后,您可能想退出while()
循環。
更新:
此外,代碼還可以通過將非0
終止的“字符串”傳遞給printf()
來調用未定義的行為。
為了解決這個問題讀一個char
少buff
那么它的大小,並添加了0
終止子。
while (1)
{
ssize_t is_received = recv(client_sock, buff, sizeof buff - 1, 0);
if (is_received < 0){
perror("Received failed");
break;
} else if (is_received == 0) {
printf("%s\n", "peer shutdown");
break;
}
buff[is_received] = '\0';
printf("RESPONSE: %s\n", buff);
}
好的,我明白了,如果您只是關閉終端而沒有通過telnet本身正確關閉連接(即,轉義字符和quit
命令),則Mac OS X(Yosemite)上的telnet
發送一些數據。
老實說,我不知道它是錯誤還是某種調試行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.