tcp/ip编程,请问怎么获取客户机突然断电而吊线的消息

冰杰007 2009-01-04 10:51:58
大家好,我用TCP/IP协议,SOCKET异步通讯编程,有WSAAsyncSelect(SocketAccept[i],m_hWnd,WM_SOCKET_READ,FD_READ|FD_CLOSE);消息机制
有消息我就去读去数据,但我不知道,客户端正常退出我可以得到消息,但客户突然断电好象就不能获取到消息了!请问我怎么做才能及时的得到客户已经通讯不上的消息呢?
...全文
90 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰杰007 2009-01-04
  • 打赏
  • 举报
回复
我用一个线程来检测,但好象没有效果
UINT _CheckClientConnect(LPVOID lparam)//检查是否有客户端退出
{
CLongGeneDlg *dlg=(CLongGeneDlg*)lparam;
char buf[4]="123";
int nCharSend=0;
while(1)
{
Sleep(3000);
for(int i=0;(i<=server_usernum)&&(dlg->SocketAccept[i]!=INVALID_SOCKET);i++)//server_usernum表示连接客户的个数
{

nCharSend=send(dlg->SocketAccept[i], buf,3,0);
if(nCharSend==-1)//如果发送不成功
{
AfxMessageBox(_T("ARM OUT"));
}

}
}
return 0;
}
ilovedrv 2009-01-04
  • 打赏
  • 举报
回复
典型的做法还是心跳包,这个具备通用性
controstr 2009-01-04
  • 打赏
  • 举报
回复
第一,使用心跑包,时间可以自己行设定,30秒或1分钟或其它时间都可以,
第二,根据recv或send的返回值判断,如果返回-1则说明套接字有错误,如果返回0说明套接字正常断开,这时可以T出链接
CodeProject-Jerry 2009-01-04
  • 打赏
  • 举报
回复
也可以试试TCP本身的

struct tcp_keepalive ka;
struct tcp_keepalive outka;
DWORD insize= 0;
DWORD outsize=0;
DWORD bytesout=0;

ka.onoff=1;
ka.keepalivetime=6*1000; //6秒
ka.keepaliveinterval=1000; //1秒

int ret=::WSAIoctl(socket, SIO_KEEPALIVE_VALS,
&ka, sizeof(struct tcp_keepalive),
&outka, sizeof(struct tcp_keepalive),
&bytesout, NULL, NULL );
fandh 2009-01-04
  • 打赏
  • 举报
回复
为了保证互相连接,必须没过一段时间,互相发保活包,如果一定时间没有收到或者发保活包没有回音,就认为断了
CodeProject-Jerry 2009-01-04
  • 打赏
  • 举报
回复
使用心跳检测

客户端每隔30s向服务器发一次心跳包

如果服务器在60S内没有收到客户端的心跳包,则认为掉线了。 踢出链接

18,357

社区成员

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

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