在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收
对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF 9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)
对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)
因此对于简单的状态判断(不过多考虑异常情况):
recv返回>0, 正常
我给你再回答详细点:客户端或服务器接收到的客户端:socket有系统超时时间,现有所有系统一般是30秒到2分钟;应用可以把超时时间再设小。如果过了超时时间,还读取不到数据或发送不了数据。就会返回connected time out错误。socket的链接函数会返回,会自动关闭链接。超时时间内,会有N次重试,一般是系统平台在管理。应用级的重连机制需要应用程序实现。对服务器端,监听类型的socket(服务类的socket),不管网络断不断,一直会有效。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)