如何得知对方已关闭连接??????????????????

mul 2003-01-23 04:52:43
tcp中,把accept得到的CSocket::m_hSocket传入线程中,Attach后使用,收发正常。但发现当连接的另一端ShutDown后,OnClose()并不被调用,Receive(...)返回0,且变成非阻塞调用。请问这种情况下怎样得知对方的ShutDown或Close。另外,如果是完线断了或其他硬件连接中断,该如何得知呢?

...全文
26 点赞 收藏 34
写回复
34 条回复
HongHuer 2003年02月08日
别的模型也可以类似的判断。
回复 点赞
HongHuer 2003年02月08日
回复人: yyc_csdn(yyc) ( ) 信誉:100 2003-1-28 14:10:35 得分:0

使用select(),如果socket连接异常它会返回错误!

同意一部分。
先select,FD_ISSET()为真了。(断开了也为真)
再int nRecv = recv()
if(nRect == 0)
{
//断开了
}


回复 点赞
mul 2003年02月08日
我现在就想问:
对于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写的,各位不知有没有用过,介绍一下。
回复 点赞
jindayu 2003年02月02日
定时发送信息以检验是否还在连接是一种方法,如果能依靠系统提供的程序检验的话更好,不过原理还是一样的。
回复 点赞
superkt 2003年02月02日
可以这样啊,一条线程传送数据,另一条线程用来通讯,检查是否还在连接
回复 点赞
silentduck 2003年02月02日
对于一个全双工的TCP连接,在一端调用shutdown只是关闭某一方向的通信,实际上TCP连接还是存在的,也就是说还没有发送FIN抱文,系统为插口分配的资源都还保留,当然也不会有OnClose被调用了,如果一方调用了close,FIN被发送,OnClose会被调用的
回复 点赞
barsteng 2003年01月29日
呵呵,各位楼上的,我所知道的是这样:
当你在适当的时候调用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
回复 点赞
visioz 2003年01月29日
关注
回复 点赞
top_hipster 2003年01月29日
如果服务端主机shutdown或者程序dump,都会给你的客户端程序发送长度为0的消息,依靠这个可以判断对方是否关闭!
但是TCP对于网络连线物理断开无任何侦测能力,除非这时你在传送数据,你才会发现网络出了问题,因此对于这类错误,你必须使用定时询问的方式才能了解错误的发生。
回复 点赞
sniper81 2003年01月29日
关注~~`正如上面一位老兄的话,TCP应该自己能发现连接的中断,并上报给上面的层阿~~我也猜不透了
回复 点赞
fzlong 2003年01月28日
gz
回复 点赞
yyc_csdn 2003年01月28日
使用select(),如果socket连接异常它会返回错误!
回复 点赞
wos 2003年01月28日
使用原始的套接字!
回复 点赞
kuhx 2003年01月27日
呵呵,开个玩笑,
最好还是握手一下
回复 点赞
kuhx 2003年01月27日
打个电话问问!
回复 点赞
chijiao 2003年01月27日
我们认为对服务端而言,非超时的错误,都可以认为对方关闭。当然,对CLIENT与与SERVER端的通讯,相互可以通过在闲时的握手消息(ECHO消息)得知对方的状态。
回复 点赞
devil97518 2003年01月27日
可以sleep(100)等待对方i/o结束,tcp应该自己应该可以判断的。然后发送消息判断。
回复 点赞
mul 2003年01月27日
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.但我试了一下,好像不是那么回事。不知各位试过没有
回复 点赞
mfkzj 2003年01月27日
Receive(...)返回0 最好是自己写一个传送函数 如果没有返回就判断对方退出
回复 点赞
superkt 2003年01月26日
recv()返回0不一定代表对方已经关闭连接了啊,假如是数据传送完毕或者网络阻塞造成超时?我想这样是否可行:分析得到的IP数据包的头部,如果有了FIN字段,那就是正常关闭连接,如果长时间比如2分钟不能收到数据那就是连接断开(包括非正常关闭),关注
回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

7878

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告