在linux中对客户端断开进行反应

时间:2012-06-12 10:13:20

标签: linux multithreading sockets

我正在编写一个简单的套接字守护程序,它会侦听端口并读取传入的数据。它工作正常,直到我选择断开客户端与服务器...然后它进入infinte循环recv()返回最后一个数据包永远不会到-1。我的问题是如何检测客户端已断开连接并关闭线程/套接字

我的主题如下:

void * SocketHandler(void* lp){
    int * csock = (int*)lp;
    int test = 0;

    char buffer[1024];
    int  buffer_len = 1024;
    int  bytecount,ierr;
    memset(buffer,0,buffer_len);
    while (test == 0)
    {
    if ((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){

        close(csock);
        free(csock);
        test++;
        return 0;
    }
    else
    {
        syslog(LOG_NOTICE,"%s",buffer);

    }
    }
    return 0;
};

3 个答案:

答案 0 :(得分:1)

完全关闭的套接字将以ZERO读取结束,而断开的连接是返回-1的错误状态。您需要捕获您的recv。{/ p>的0返回

答案 1 :(得分:0)

这里发生的事情是你的结局可能无法检测到套接字已死的事实(特别是,如果你只是从它读取)。

您可以做的是在套接字上设置keepalive。这将打开套接字活动的定期检查。但是不要指望快速反应,默认超时是20分钟。

i = 1;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&i, sizeof(i));

另一个选择是进行自己的保持活动。

答案 2 :(得分:0)

recv()将通过返回0来指示套接字的正确关闭(有关详细信息,请参阅manpage)。当且仅当发生错误时,它将返回-1。您应该检查errno是否有确切的错误,因为它可能会或可能不会表明连接失败(EINTREAGAINEWOULDBLOCK [假设非阻塞套接字]两者都是可恢复的错误。)

旁注:没有必要将套接字的fd作为指针传递,因为您要返回void *,可能需要将return 0更改为return NULL (仅为了便于阅读)。