sock建立连接以后,过一段时间,如何知道对方是否关闭连接??
解决方案 »
- 我用Visual studio的format函数时,出现了问题,求高手解决!!!急急急!!!
- Hook那个函数可以禁止文件夹(不是文件)被复制(在线等)
- switch中,两个case的处理一样,怎么写??
- UDP-----如果保证包不丢失?
- 模板函数问题
- 数据库问题~~~~参数
- ActiveMovie控件播放流媒体(全屏问题,屏蔽右键问题)
- MFC单文档中打开一幅位图,怎么判断鼠标是否进入打开的位图区域
- 有谁用ado连接过Oracle?一个具体问题。
- 我收不到这个消息
- 怎么自画report型的CListCtrl的SubItem?
- 各位大虾救命啊!请问怎么在一个DIALOG中使用RICHEDITVIEW,谢谢大家了
非block型socket,在对方关闭连接的时候,会收到FD_CLOSE事件
{
BOOL bConnDropped = FALSE;
INT iRet = 0;
BOOL bOK = TRUE;
if (m_hSocket == INVALID_SOCKET)
return TRUE; struct timeval timeout = { 0, 0 };
fd_set readSocketSet;
FD_ZERO(&readSocketSet);
FD_SET(m_hSocket, &readSocketSet);
iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
bOK = (iRet > 0);
if(bOK)
{
bOK = FD_ISSET(m_hSocket, &readSocketSet);
}
if(bOK)
{
CHAR szBuffer[1] = "";
iRet = ::recv(m_hSocket, szBuffer, 1, MSG_PEEK);
bOK = (iRet > 0);
if(!bOK)
{
INT iError = ::WSAGetLastError();
bConnDropped = (( iError == WSAENETRESET) ||
(iError == WSAECONNABORTED) ||
(iError == WSAECONNRESET) ||
(iError == WSAEINVAL) ||
(iRet == 0));
}
}
return(bConnDropped);
}CMySocket派生于CSocket
不管是正常关闭还是非正常关闭(停电、死机),都会触发onclose事件,重载即可
mfc的socket我没试过,如果能检测到就太好了!
zyleon(zy)的方法我试过了,不行
对方如果能正常的关闭连接,你的send()和recv()都会返回WSAECONNRESET错误。
如果对方没有正常关闭连接,比如说突然掉线,死机,重启什么的。那就只能等待send()和recv()超时了,程序要过很久才能知道连接已经失效了。怎样立即得到通知的方法大家一直都在讨论,好像现在也没有一个很合适的普遍的解决办法。不过如果是是针对很具体的应用,一般都有特殊的办法吧。
而且select处理socket的IO多路读写都是很有效的。
另外,如果采用Win32的完成端口模型则内核会在适当的时候让你知道的。