关于winsock keepalive使用的几点疑问(基于TCP)

cpp_crab 2009-08-11 04:48:32

1、如果是服务端希望检测客户端的非正常掉线,KeepAlive属性是在服务端代码设置(连接建立成功之后)还是在客户端的代码设置呢?或者是两端都要设置?

2、关于结构体
struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};

不是非常明白keepalivetime和keepaliveinterval的含义,英文比较菜,MSDN的解释如下:
The keepalivetime member specifies the timeout, in milliseconds, with no activity until the first keep-alive packet is sent. The keepaliveinterval member specifies the interval, in milliseconds, between when successive keep-alive packets are sent if no acknowledgement is received.

可否认为是没经历keepaliveinterval时间,重新发送一次心跳包,一次成功的心跳包返回后,keepalivetime时间内不再发送心跳包?

3、对于完成端口而言,如果接收到成功的心跳包,GetQueuedCompletionStatus是否会返回呢?如果会返回的话,返回值为TRUE,lpNumberOfBytes 得到的值为0? 如果心跳包确认超时的话,GetQueuedCompletionStatus会得到返回值FALSE?


不知道说清楚了没,希望大家能够帮我解惑一下,不胜感激!

...全文
294 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpp_crab 2009-08-11
  • 打赏
  • 举报
回复

以上的各位很好很强大,我的问题基本解决了…

sun007700 2009-08-11
  • 打赏
  • 举报
回复

struct tcp_keepalive {
u_long onoff;
u_long keepalivetime; // 多长时间(ms)没有数据就开始send心跳包
u_long keepaliveinterval; // 每隔多长时间(ms)send一个心跳包,发5次(系统值)
};
socoola 2009-08-11
  • 打赏
  • 举报
回复
3、如果心跳包发送超时,连接就会断开,GetQueuedCompletionStatus会返回0,通过GetLastError可以获知原因。如果心跳包发送后被确认,GetQueuedCompletionStatus不会返回,因为keepalive是tcp层的事情,成功没有必要通过应用层
socoola 2009-08-11
  • 打赏
  • 举报
回复
2、struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};

如果连接在keepalivetime时间内没有收发数据,则发送第一个keepalive报文,如果在keepaliveinterval时间内没有收到确认则发送下一个keepalive报文。
socoola 2009-08-11
  • 打赏
  • 举报
回复
1、如果是服务端希望检测客户端的非正常掉线,KeepAlive属性是在服务端代码设置(连接建立成功之后)还是在客户端的代码设置呢?或者是两端都要设置?

谁要检测谁就设置,在你的例子中是服务器需要设置。
cpp_crab 2009-08-11
  • 打赏
  • 举报
回复
感谢 vagrantisme的回复…

KeepAlive参数是TCP层的。
GetQueuedCompletionStatus是TCP层之上的。

这个我可以理解,但是心跳包超时应该要以某条函数的调用失败来通知程序吧?

那个链接讲得是Linux,或许winsock有些不同吧
我Google到的上Winsock下的设置基本是采用WSAIoctl
vagrantisme 2009-08-11
  • 打赏
  • 举报
回复
KeepAlive参数是TCP层的。

GetQueuedCompletionStatus是TCP层之上的。

关于KeepAlive参数请参考:
http://www.diybl.com/course/webjsh/osgl/20071215/92510.html

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧