当前位置: 技术问答>linux和unix
(在线等待!!!)我想问一下作为客户端时,如果服务端的主机已关闭,这时应怎样处理。
来源: 互联网 发布时间:2015-01-21
本文导语: 如果服务端的主机已关闭,这时应怎样处理。这里用阻塞的SOCK时会一直等待(应该是9分钟)用非阻塞的SOCK时,会连不上(服务端的主机开着时,我 set linger={1,0} )。 | 服务器主机关闭你的...
如果服务端的主机已关闭,这时应怎样处理。这里用阻塞的SOCK时会一直等待(应该是9分钟)用非阻塞的SOCK时,会连不上(服务端的主机开着时,我 set linger={1,0} )。
|
服务器主机关闭你的客户端是没有办法感知到的,除非在关闭后你向服务器进行了write操作此时write会返回ECONNREST的错误。
一般的情况是设置read的超时处理,办法主要有两种1。利用alarm();2.利用select().
另外你也可以利用加急数据(OOB)的特点设计定时的检测程序,来定时查看网络的连接情况。
一般的情况是设置read的超时处理,办法主要有两种1。利用alarm();2.利用select().
另外你也可以利用加急数据(OOB)的特点设计定时的检测程序,来定时查看网络的连接情况。
|
你加上超时设置
CSocket::WaitForIncoming(int seconds)
{
fd_set fdset;
struct timeval timeout;
FD_ZERO(&fdset);
FD_SET(m_SocketFD, &fdset);
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
int ret = select(m_SocketFD + 1, &fdset, NULL, NULL, &timeout);
return ret;
}
在seconds秒后如果没有收到东东,socket退出,你可以继续你的处理了
CSocket::WaitForIncoming(int seconds)
{
fd_set fdset;
struct timeval timeout;
FD_ZERO(&fdset);
FD_SET(m_SocketFD, &fdset);
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
int ret = select(m_SocketFD + 1, &fdset, NULL, NULL, &timeout);
return ret;
}
在seconds秒后如果没有收到东东,socket退出,你可以继续你的处理了
|
服务器正常关机,客户端可以知道.当服务器正常关机时系统会发送关闭字节,引发四路关闭操作,客户端READ时可以知道,WRITE时会出错.(我指的是TCP)
而服务器掉电就只能使用定时检测属性了.
而服务器掉电就只能使用定时检测属性了.
|
楼上说的没错!
另:你可以激活socket的alive选项,系统会自动检测连接是否正常!
另:你可以激活socket的alive选项,系统会自动检测连接是否正常!