法一:当recv返回值小于等于0时,socket连接断开。但是还需要判断errno是否等于EINTR,如果errno==EINTR则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。法二:structtcp_infoinfo;intlen=sizeofinfo;getsockoptsock,IPPROTO_TCP,TCP_INFO,&info,socklen_t*&len;ifinfo.tcpi_state==TCP_ESTABLISHED则说明未断开else断开法三:若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。法四:intkeepAlive=1;//开启keepalive属性intkeepIdle=60;//如该连接在60秒内没有任何数据往来,则进行探测intkeepInterval=5;//探测时发包的时间间隔为5秒intkeepCount=3;//探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.setsockoptrs,SOL_SOCKET,SO_KEEPALIVE,void*&keepAlive,sizeofkeepAlive;setsockoptrs,SOL_TCP,TCP_KEEPIDLE,void*&keepIdle,sizeofkeepIdle;setsockoptrs,SOL_TCP,TCP_KEEPINTVL,void*&keepInterval,sizeofkeepInterval;setsockoptrs,SOL_TCP,TCP_KEEPCNT,void*&keepCount,sizeofkeepCount;设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误。
龙巧妹2019-11-05 20:03:42