检测客户端已断开连接

时间:2015-12-28 12:39:45

标签: c linux sockets

我有一个监听套接字的简单程序。一切都很顺利,除非在while(1)周期中连接丢失。在这种情况下,程序会多次从套接字读取而没有结果。如何在while(1)周期中检测断开连接的客户端?

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>


void printHex(char * bts  )
{
    char *s = bts;
    int i=0;
    do
    {
        printf("%02X ", (unsigned char  ) *bts);

    } while (* ++bts !=0);
    printf("%s\n",s);

}


int main()
{
    char str[100];
    int listen_fd, comm_fd;

    struct sockaddr_in servaddr;

    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

    bzero( &servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(22000);
    printf("binding\n");

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    printf("listening\n");

    listen(listen_fd, 10);
    printf("accepting\n");

    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
    printf("accep done\n");

    int cn =0;

    while(1)
    {

        bzero( str, 100);
        printf("will read\n");
        int br= read(comm_fd,str,100);
        printf("read done\n");

        if (br>0)
        {
            printHex(str);
        }

    }
}

2 个答案:

答案 0 :(得分:2)

变化:

    if (br>0)
    {
        printHex(str);
    }

要:

    if (br<=0) break;
    printHex(str);

此外,您的代码错误处理了第一个字节为零的情况。并且您无法避免这种情况,因为TCP不会保留应用程序消息边界。您应该将br传递给printHex,以便知道要打印的字符数。

答案 1 :(得分:0)

您需要检查read()的结果。如果连接已关闭,您将获得返回代码。

来自manual page

  

出错时,返回-1,并正确设置errno。