2011-04-18 144 views

回答

5

创建cusomt插座类继承.NET套接字类:

public delegate void SocketEventHandler(Socket socket); 
    public class CustomSocket : Socket 
    { 
     private readonly Timer timer; 
     private const int INTERVAL = 1000; 

     public CustomSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType) 
      : base(addressFamily, socketType, protocolType) 
     { 
      timer = new Timer { Interval = INTERVAL }; 
      timer.Tick += TimerTick; 
     } 

     public CustomSocket(SocketInformation socketInformation) 
      : base(socketInformation) 
     { 
      timer = new Timer { Interval = INTERVAL }; 
      timer.Tick += TimerTick; 
     } 

     private readonly List<SocketEventHandler> onCloseHandlers = new List<SocketEventHandler>(); 
     public event SocketEventHandler SocketClosed 
     { 
      add { onCloseHandlers.Add(value); } 
      remove { onCloseHandlers.Remove(value); } 
     } 

     public bool EventsEnabled 
     { 
      set 
      { 
       if(value) 
        timer.Start(); 
       else 
        timer.Stop(); 
      } 
     } 

     private void TimerTick(object sender, EventArgs e) 
     { 
      if (!Connected) 
      { 
       foreach (var socketEventHandler in onCloseHandlers) 
        socketEventHandler.Invoke(this); 
       EventsEnabled = false; 
      } 
     } 

     // Hiding base connected property 
     public new bool Connected 
     { 
      get 
      { 
       bool part1 = Poll(1000, SelectMode.SelectRead); 
       bool part2 = (Available == 0); 
       if (part1 & part2) 
       return false; 
       else 
       return true; 
      } 
     } 
    } 

然后使用它是这样的:

 var socket = new CustomSocket(
       //parameters 
       ); 

     socket.SocketClosed += socket_SocketClosed; 
     socket.EventsEnabled = true; 


     void socket_SocketClosed(Socket socket) 
     { 
      // do what you want 
     } 

我刚刚实施了每个插座套接字关闭事件。所以你的应用程序应该为这个事件注册事件处理程序。那么套接字会通知你的应用程序,如果它本身是关闭的;)

如果代码有问题,通知我。

+0

Socket.Connected不可实现 – Will 2011-04-18 04:48:33

+0

在自定义类中实现的新的关联属性。尝试一下,它会奏效。 – 2011-04-18 04:53:02

+0

Poll方法在linux上不起作用。即使套接字已关闭,它仍会继续返回false。这就是为什么我正在寻找一种不使用投票的方式。 – Will 2011-04-18 05:01:09

0

Socket类有一个Connected属性。根据MSDN,检查呼叫是非阻塞的。这不是你想要的吗?

+0

这是轮询解决方案 – 2011-04-18 04:38:26

+0

连接属性似乎总是​​如此,除非我自己断开套接字。我只是检查,即使套接字被远程服务器断开,它仍然返回true。 – Will 2011-04-18 04:39:22