2011-04-18 14 views

Respuesta

5

crear una clase toma clases de .NET toma cusomt heredar:

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; 
      } 
     } 
    } 

luego usarlo como esto:

 var socket = new CustomSocket(
       //parameters 
       ); 

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


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

acabo en marcha un evento de cierre del zócalo en cada toma. por lo que su aplicación debe registrar controladores de eventos para este evento. entonces el zócalo informará a su aplicación si fue cerrado;)

si hubo algún problema con el código, infórmeme.

+0

Socket.Connected no es posible – Will

+0

new Propiedad conectada implementada en Custom Class. pruébalo, funcionará. –

+0

El método de encuesta no funciona en Linux. Incluso cuando el socket esté cerrado continuará devolviendo false. Es por eso que estoy buscando un camino sin usar la encuesta. – Will

0

La clase Socket tiene una propiedad Connected. De acuerdo con MSDN, la llamada para verificar no es bloqueante. ¿No es esto lo que estás buscando?

+0

esta es la solución de sondeo –

+0

La propiedad Connected siempre parece ser cierta a menos que desconecte el Socket por mi cuenta. Acabo de verificar y, aunque el servidor remoto desconectó el socket, sigue siendo verdadero. – Will

Cuestiones relacionadas