簡體   English   中英

接收呼叫獲取空數據

[英]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()來調用未定義的行為。

為了解決這個問題讀一個charbuff那么它的大小,並添加了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM