我正在编写一个简单的套接字守护程序,它会侦听端口并读取传入的数据。它工作正常,直到我选择断开客户端与服务器...然后它进入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;
};
答案 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
是否有确切的错误,因为它可能会或可能不会表明连接失败(EINTR
,EAGAIN
或EWOULDBLOCK
[假设非阻塞套接字]两者都是可恢复的错误。)
旁注:没有必要将套接字的fd
作为指针传递,因为您要返回void *
,可能需要将return 0
更改为return NULL
(仅为了便于阅读)。