1、心跳方法我知道,但这次不知道对方的心不会跳
2、通过发送测试性数据是否成功的方法然后检测错误也不适用于这里,因为对方收到莫名奇妙的东西时会弹出来说有“垃圾信息”
3、有人说用recv()的方法,若返回值小于等于0就认为对方断开了,但是这次对方基本是哑巴,我recv一直收不到任何东西,只会阻塞在那儿
4、有人用WSAASyncSelect,我写的是WSAASyncSelect(m_sock, m_dlg->m_hWnd, WM_MYMSG, FD_CONNECT),然后在WindowProc的时候也没有找到对方断开后会发送什么暗号给我,这个方法我不会用请教高人速速教我怎么不发送测试信息而又能及时判断对方断开了原先建立的socket(比如对方的程序关闭了)分数就这么多了,抱歉。
2、通过发送测试性数据是否成功的方法然后检测错误也不适用于这里,因为对方收到莫名奇妙的东西时会弹出来说有“垃圾信息”
3、有人说用recv()的方法,若返回值小于等于0就认为对方断开了,但是这次对方基本是哑巴,我recv一直收不到任何东西,只会阻塞在那儿
4、有人用WSAASyncSelect,我写的是WSAASyncSelect(m_sock, m_dlg->m_hWnd, WM_MYMSG, FD_CONNECT),然后在WindowProc的时候也没有找到对方断开后会发送什么暗号给我,这个方法我不会用请教高人速速教我怎么不发送测试信息而又能及时判断对方断开了原先建立的socket(比如对方的程序关闭了)分数就这么多了,抱歉。
tcp方式在正常情况下对方关闭会发送关闭socket消息,这是socket会被置为无效状态,通过select判断socket是否还可写能判断是否连接正常,如果对方拔网线,那不行,但是可以重建一个socket,看看能不能connect成功判断。
如MFC中无论哪一方关闭socket,对方都会就会触发OnClose响应,拔网线不行。
不过,为什么要去掉心跳包呢?对系统有什么影响呢
阻塞方式下,recv()函数收到小于等于0的返回值就是说明断链了。但是对端拔网线基本上检测不出来。此时只能靠心跳包来检测。心跳包可以是应用层自定义的心跳消息,也可以是TCP协议本身的Keep-Alive消息。建议用Keep-Alive消息,系统开销很小,并且很有效。可通过setsockopt来设置keep-alive消息的间隔时间,建议30秒
如果不正常断开,如死机、网线突然断开,可以采取定时发送数据包的方式来检测。比如,a每隔5秒向b发送一个数据包并将某标志位置0,b收到后返回给a,并将标志位置1。如果b断开了就不能返回,标志位继续保持为0。这样只要检测标志位是1还是0就知道对方是否断开了。
具体原理没有研究,但是我想在VC中一定也是可以做出来得。
然后交给select函数,在一个线程里循环收数据包即可
对方一断开,另一端立即能感知到,select会立即受信,你可以试试