当前位置: 技术问答>linux和unix
如何得知对方已关闭连接?
来源: 互联网 发布时间:2015-01-06
本文导语: 我是Client端,用Select阻塞等待数据包,用recv读数据,当返回为-1时判断为对方断开。 可好像行不通,对方一断开,我的Recv返回总是为零。 代码如下: switch(iRet = select(pClient->sockfd+1, &fdR, NULL, NULL, &timeout)){ case -1...
我是Client端,用Select阻塞等待数据包,用recv读数据,当返回为-1时判断为对方断开。
可好像行不通,对方一断开,我的Recv返回总是为零。
代码如下:
switch(iRet = select(pClient->sockfd+1, &fdR, NULL, NULL, &timeout)){
case -1 : // Select异常
fprintf(stderr, "CSocketClient::OnRecv::select:: sockfd-%d, errno-%d>>%sn", pClient->sockfd, errno, strerror(errno));
break;
case 0 : // 超时
fprintf(stderr, "CSocketClient::OnRecv::select:: timeout!n");
continue;
default :
fprintf(stderr, "select returns::%dn", iRet);
if (FD_ISSET(pClient->sockfd, &fdR)){
if ((len = recv(pClient->sockfd, (unsigned char *)&hLength, 4, 0)) == -1){ // 对方断开连接
pClient->bConnect = false;
fprintf(stderr, "CSocketClient::OnRecv::select:: sockfd-%d, errno-%d>>%sn", pClient->sockfd, errno, strerror(errno));
break;
}
可好像行不通,对方一断开,我的Recv返回总是为零。
代码如下:
switch(iRet = select(pClient->sockfd+1, &fdR, NULL, NULL, &timeout)){
case -1 : // Select异常
fprintf(stderr, "CSocketClient::OnRecv::select:: sockfd-%d, errno-%d>>%sn", pClient->sockfd, errno, strerror(errno));
break;
case 0 : // 超时
fprintf(stderr, "CSocketClient::OnRecv::select:: timeout!n");
continue;
default :
fprintf(stderr, "select returns::%dn", iRet);
if (FD_ISSET(pClient->sockfd, &fdR)){
if ((len = recv(pClient->sockfd, (unsigned char *)&hLength, 4, 0)) == -1){ // 对方断开连接
pClient->bConnect = false;
fprintf(stderr, "CSocketClient::OnRecv::select:: sockfd-%d, errno-%d>>%sn", pClient->sockfd, errno, strerror(errno));
break;
}
|
返回0表示对方正常关闭推出,-1表示出现错误
|
我也遇到这个问题了,我的解决方法是两端协商不会发送大小为0的数据,这样当recv()的返回值为0时,即表明已断开连接,另外不知你试过没有好像发送大小为0的数据时不一定可以发送出去,不知道为什么?我也想知道有没有更好的方法来判断对方断开连接?
另外在此也向你请教一个问题,除了用select(),有没有别的方法来控制超时,因为我想把超时控制封装在一个类中,实现一个通用的方法,而select()好像对消息队列不能使用。不知你用过alarm()来控制超时么?我在Linux下为什么系统信号不中断recv()的阻塞?
另外在此也向你请教一个问题,除了用select(),有没有别的方法来控制超时,因为我想把超时控制封装在一个类中,实现一个通用的方法,而select()好像对消息队列不能使用。不知你用过alarm()来控制超时么?我在Linux下为什么系统信号不中断recv()的阻塞?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。