繁体   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