1.用Event I/O可解决。但还是没搞清楚CSocket在线程中怎么会这样。 2.用了Ping解决。但心有不甘,tcp这样面向连接的协议,还要在用户程序这一级做这些事吗?搞得跟写Udp一样。在sock option有SO_KEEPALIVE一项,MSDN说: If a connection is dropped as the result of keep-alives the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN.但我试了一下,好像不是那么回事。不知各位试过没有
我现在就想问: 对于SO_KEEPALIVE,MSDN说: If a connection is dropped as the result of keep-alives the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN. 我使用SO_KEEPALIVE,但结果不象MSDN写的,各位不知有没有用过,介绍一下。
关闭程序或网络本身出线问题OnClose都不会响应
那就靠这个判断吧。
而其他的如非法操作等ONCLOSE都不会响应。
我用的办法是每隔一定的时间发一些信息,如果对方已经断了,那么就会收到发送异常。从而知道对方已经断了。
对方的程序可能根本就不是你来做的 怎么自定义消息?
1。连接的另一端使用ShutDown()或Close(),我这儿的OnClose怎么没有响应。是不是和在线程中使用CSocket有关。不过m_hSocketWindow已正常创建,WSAAsyncSelect也没有错误,没有理由收不到。
2。但硬件中断后,如进行读操作,一般会陷入诸塞状态,如果等待操作结束,可能要事先对超时加以设置。不知有没有更好的办法。希望有经验的朋友能够指点一下。
attach已调用AsyncSelect
2.用了Ping解决。但心有不甘,tcp这样面向连接的协议,还要在用户程序这一级做这些事吗?搞得跟写Udp一样。在sock option有SO_KEEPALIVE一项,MSDN说:
If a connection is dropped as the result of keep-alives the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN.但我试了一下,好像不是那么回事。不知各位试过没有
但是TCP对于网络连线物理断开无任何侦测能力,除非这时你在传送数据,你才会发现网络出了问题,因此对于这类错误,你必须使用定时询问的方式才能了解错误的发生。
当你在适当的时候调用recv时(我指的适当有如下两种情况:阻塞socket时recv有返回,或者非阻塞情况下当接收到recv事件时),如果recv返回0,则表示远端已经优雅的关闭了socket,
如果你一定想在某个时候知道对方是否还保持着socket连接,你应该使用MSG_PEEK作为参数调用recv,使用MSG_PEEK时,从tcp队列中取出数据,但并不会将队列中的数据清掉,如果recv(..MSG_PEEK)返回的值为错误,则表示对方肯定已经掉线了
欢迎拍砖—————————————————————————————————
┏━★━━◆━━★━┓
♂欢|◢CSDN◣|使♂ ▲自由保存帖子,浏览,关注检测
┃迎|◥论坛助手◤|用┃ ▲完善的CSDN客户端工具
┗━☆━━◇━━━☆┛ ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
http://www.csdn.net/expert/topic/573/573604.xml
http://www.chinaok.net/csdn/csdn.zip
对于SO_KEEPALIVE,MSDN说:
If a connection is dropped as the result of keep-alives the error code WSAENETRESET is returned to any calls in progress on the socket, and any subsequent calls will fail with WSAENOTCONN.
我使用SO_KEEPALIVE,但结果不象MSDN写的,各位不知有没有用过,介绍一下。
使用select(),如果socket连接异常它会返回错误!同意一部分。
先select,FD_ISSET()为真了。(断开了也为真)
再int nRecv = recv()
if(nRect == 0)
{
//断开了
}