如果得知一个TCP连接的remote端已经不在网络上了?

bbdolly 2007-03-07 11:28:55
一个TCP连接(中间可能会有NAT存在)
双方会有较长时间不相互发数据
在不使用一些非标准的方法的前提下(自定义的主动探测),如何得知对方已经不在网络上了?
...全文
347 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
anjuta_c 2007-03-15
  • 打赏
  • 举报
回复
SO_KEEPALIVE选项会影响系统上所有的套接字,还是不要更改的好,况且设置好SO_KEEPALIVE后实际上还是发送了“心跳包”,这样做和应用层发送“心跳包”有区别吗?

标准做法还是在应用层发送“心跳包”。可你看一下unix 网络编程卷1。

ouyh12345 2007-03-07
  • 打赏
  • 举报
回复
BOOL bKeepAlive = TRUE;
nRet = ::setsockopt(m_sockDesc, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet !=0)
{
sprintf(m_pszError, "Winsock error : %s (Error Code %d)\n", "Socket SetOpt failed", WSAGetLastError());
return FALSE;
}

//设置KeepAlive检测时间和次数
TCP_KEEPALIVE inKeepAlive = {0}; //输入参数
unsigned long ulInLen = sizeof(TCP_KEEPALIVE);

TCP_KEEPALIVE outKeepAlive = {0}; //输出参数
unsigned long ulOutLen = sizeof(TCP_KEEPALIVE);

unsigned long ulBytesReturn = 0;

//设置socket的keep alive为10秒,并且发送次数为3次
inKeepAlive.onoff = 1;
inKeepAlive.keepaliveinterval = 10000; //两次KeepAlive探测间的时间间隔
inKeepAlive.keepalivetime = 3; //开始首次KeepAlive探测前的TCP空闭时间

nRet = WSAIoctl(m_sockDesc,
SIO_KEEPALIVE_VALS,
(LPVOID)&inKeepAlive,
ulInLen,
(LPVOID)&outKeepAlive,
ulOutLen,
&ulBytesReturn,
NULL,
NULL);
if(SOCKET_ERROR == nRet)
{
sprintf(m_pszError, "Winsock error : %s (Error Code %d)\n", "Nonblocking socket call error", WSAGetLastError());
return FALSE;
}

这样发送的心跳包是必须要回的.
bbdolly 2007-03-07
  • 打赏
  • 举报
回复
如何在对方没有发送数据过来的时候,主动发送tcp的应答包啊?
这种主动发送的应答包,remote方会在应答回来么?

谢过~~
Elysium 2007-03-07
  • 打赏
  • 举报
回复
自定义的主动探测?
可以发送应答包吧,如果连应答包也不发送,简单的ping也不通呀
张友邦 2007-03-07
  • 打赏
  • 举报
回复
做网络应用的时候这样的问题会经常碰到,我以前的处理办法是,不管对方是否已经断开,当要通信的时候去处理相应的exceptions。这样也能解决你要求的对方连接状态的问题。
bbdolly 2007-03-07
  • 打赏
  • 举报
回复
win2000 vc6 下套代码可以用么?
为啥我用了之后抓包发现没啥变化,还是啥数据都没有啊
bbdolly 2007-03-07
  • 打赏
  • 举报
回复
win2000 vc 下套代码可以用么?
为啥我用了之后抓包发现没啥变化啊

18,356

社区成员

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

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