用select和msg_oob实现 心跳;
对于oob数据 ,默认情况下 [ 不开OOBINLINE]:
他不在接受缓冲区, 而在另1个缓冲区中,这个缓冲区只有一个字节,因此不论客户端以MSB_OOB发送
N个字节的数据, 只有最后一个字节是OOB数据, 同理,因为只有一个字节的缓冲区,如果连续2次
发送msg_oob , 那么后一次将覆盖前一次, 最后OOB是tcp头中的一个URG指针,
需要注意的是 : 即使对方的滑动窗口是0,即无法接受数据了, OOB还是能发送过去[不伴随其他数据],
对于接受方来说, 只要知道有oob通知即可, 有没有数据以及是什么数据无所谓;因此,用oob来实现心跳,
还是比较方便的
下面代码只提供一个思路 , 只是简单的实现
客户端没实现完整, 基本思路跟服务器代码一致, 服务器代码也只接受了一个客户端,
但基本方式是一致的;
serv.cpp
#include <process.h>
#define MAX_HEART_COUNT 5 //心跳最大次数
//客户端数据
struct client_data
{
SOCKET client_sock; //socket
int heart_cnt; //心跳次数
};
volatile bool goon = true; //只是简单使用
//unix : mutex
CRITICAL_SECTION cs;
/*
用于检测客户端心跳次数的线程
* 每2秒循环一次,同时给每个heart_cnt + 1, 如果到了MAX_HEART_COUNT
* 证明此客户端已经断线
*/
unsigned int heart_beat_thread(void * param){
cout << "heart beat thread