天天看点

freebsd socket send超时或者拔出网线也不会出现错误的情况

在服务器端创建了socket,然后和客户端建立心跳检测,结果客户端关闭或者拔出网线在短时间内(10分钟之后)才会发现客户端关闭了连接。

解决法案:在服务器端设置socket的keepalive属性。

int keepalive = 1; // 开启keepalive属性

int keepidle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测

int keepinterval = 5; // 探测时发包的时间间隔为5 秒

int keepcount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));

setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle ));

setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval ));

setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount ));

每次调用recv或send时检查返回值,判断是否出错或为0.如果出错,再检查errno查资料,看哪个或哪几个错误号表示链接断了或不存在就可 以了。

继续阅读