2011-10-03 21 views
9

Şu anda böyle bir şey yapıyorum:Bir TcpListener'ın şu anda dinlemediğini belirlemek için bir özellik/yöntem var mı?

public void StartListening() 
{ 
    if (!isListening) 
    { 
     Task.Factory.StartNew(ListenForClients); 

     isListening = true; 
    } 
} 

public void StopListening() 
{ 
    if (isListening) 
    { 
     tcpListener.Stop(); 

     isListening = false; 
    } 
} 

TcpListener içinde bir TcpListener'ın dinlemeye başladığını (yani, TcpListener.Start() çağrıldı) belirlemek için bir yöntem veya özellik yok mu? TcpListener.Server'a gerçekten erişilemiyor çünkü başlatılmadıysa, henüz başlatılmadı. Ona erişebilseydim bile, bir Dinleme özelliği içerdiğinden emin değilim.

Bu gerçekten en iyi yol mu?

+0

Kendi kodunuzun * Start() adını verdiğini nasıl bilemezsiniz? Bunu biraz düşün. –

+0

@HansPassant: Bir kullanıcı arayüzü var. Kullanıcı, Windows formundaki Başlat düğmesine tıkladığında başlatılır. –

+0

Click olay işleyicisinin kodunu kim yazdı? Sen değil? Daha büyük soru: Kullanıcı neden bir düğmeyi tıklamak ister? –

cevap

18

TcpListener aslında tam olarak istediğiniz şeyi yapan Active adlı bir özelliğe sahiptir. Ancak, özellik TcpListener sınıfından devralmadıkça erişemeyeceğiniz için, bir nedenle korunur.

Projenize basit bir sarıcı ekleyerek bu sınırlamayı aşabilirsiniz.

/// <summary> 
/// Wrapper around TcpListener that exposes the Active property 
/// </summary> 
public class TcpListenerEx : TcpListener 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="T:System.Net.Sockets.TcpListener"/> class with the specified local endpoint. 
    /// </summary> 
    /// <param name="localEP">An <see cref="T:System.Net.IPEndPoint"/> that represents the local endpoint to which to bind the listener <see cref="T:System.Net.Sockets.Socket"/>. </param><exception cref="T:System.ArgumentNullException"><paramref name="localEP"/> is null. </exception> 
    public TcpListenerEx(IPEndPoint localEP) : base(localEP) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="T:System.Net.Sockets.TcpListener"/> class that listens for incoming connection attempts on the specified local IP address and port number. 
    /// </summary> 
    /// <param name="localaddr">An <see cref="T:System.Net.IPAddress"/> that represents the local IP address. </param><param name="port">The port on which to listen for incoming connection attempts. </param><exception cref="T:System.ArgumentNullException"><paramref name="localaddr"/> is null. </exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="port"/> is not between <see cref="F:System.Net.IPEndPoint.MinPort"/> and <see cref="F:System.Net.IPEndPoint.MaxPort"/>. </exception> 
    public TcpListenerEx(IPAddress localaddr, int port) : base(localaddr, port) 
    { 
    } 

    public new bool Active 
    { 
     get { return base.Active; } 
    } 
} 

Herhangi bir TcpListener nesnesinin yerine kullanabilirsiniz.

TcpListenerEx tcpListener = new TcpListenerEx(localaddr, port); 
İlgili konular