zoukankan      html  css  js  c++  java
  • C#socket通信时,怎样判断socket双方是否断开连接

    我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信。
    我把Server端得到的socket放到一个集合里,我想知道集合里的socket是否断开连接,如果断开连接我就把它从这个集合里移除。

    判断socket是否断开连接,网上有N种说法:
    1.Socket.Connected
    这个属性只能说明上一次通信时还是正常的。

    2.Socket.Pool

    这个方法是可以,但是它要从socket里读或写部分数据,如果其他线程从这个socket读写数据,那么数据将会出错。我在写一个远程通信软件时候就出现这个问题了。
    而且http://technet.microsoft.com/zh-cn/system.net.sockets.socket.poll.aspx上这样说的:
    此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。

    3.使用心跳包
    每隔一段时间,socket一方向另一方发送一段特殊的数据,socket的另一方接到这个数据后回发回来。这样就能判断socket两方都没有掉线了。

    4.

    判断Socket是否连接上,需要通过发包来确认:

    复制代码
     1         // 检查一个Socket是否可连接
     2         private bool IsSocketConnected(Socket client)
     3         {
     4             bool blockingState = client.Blocking;
     5             try
     6             {
     7                 byte[] tmp = new byte[1];
     8                 client.Blocking = false;
     9                 client.Send(tmp, 0, 0);
    10                 return false;
    11             }
    12             catch (SocketException e)
    13             {
    14                 // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
    15                 if (e.NativeErrorCode.Equals(10035))
    16                     return false;
    17                 else
    18                     return true;
    19             }
    20             finally
    21             {
    22                 client.Blocking = blockingState;    // 恢复状态
    23             }
    24         }
    复制代码

      这个函数是MSDN上提供的,经过测试,效率不错,反应很快,结合前面的多线程来检测多个Socket,以完成在线Socket界面实时更新非常不错。

    转载请注明原址:http://www.cnblogs.com/lekko/archive/2012/08/02/2619197.html 

  • 相关阅读:
    html的基本框架和常用标签
    防火墙
    Zenmap
    每日一招:熟练掌握变盘方向
    每日一招:赚钱最快的选股策略
    操盘策略:黄金做单时间
    每日一招:坚守六大方式选出优质股
    如何保卫你的牛市胜利果实?
    名家看后市:长阴破位不必慌
    每日一招:补仓需遵守的技巧
  • 原文地址:https://www.cnblogs.com/Freedom0221/p/12562010.html
Copyright © 2011-2022 走看看