0

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

我的线程如下:

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;
};
4

3 回答 3

1

干净关闭的套接字将以ZERO读取结束,而断开的连接是返回的错误状态-1。你需要赶上0你的recv的回报。

于 2012-06-12T10:18:42.697 回答
0

这里发生的情况是您的终端可能无法检测到套接字已死的事实(特别是,如果您只是从中读取)。

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

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

另一种选择是进行自己的保持活动通信。

于 2012-06-12T10:27:38.850 回答
0

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

旁注:无需将fd套接字的作为指针传递,并且由于您要返回 avoid *您可能想要更改return 0return NULL(只是为了便于阅读)。

于 2012-06-12T10:44:02.633 回答