Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a property/method for determining if a TcpListener is currently listening?

Tags:

c#

tcplistener

Currently I'm doing something like this:

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

        isListening = true;
    }
}

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

        isListening = false;
    }
}

Is there not a method or property within TcpListener to determine if a TcpListener has started listening (ie TcpListener.Start() was called)? Can't really access TcpListener.Server because if it hasn't started, it has not been instantiated yet either. Even if I could access it I'm not sure even that contains a Listening property.

Is this really the best way?

like image 328
Ryan Peschel Avatar asked Oct 03 '11 00:10

Ryan Peschel


2 Answers

The TcpListener actually has a property called Active which does exactly what you want. However, the property is marked protected for some reason so you cannot access it unless you inherit from the TcpListener class.

You can get around this limitation by adding a simple wrapper to your project.

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

Which you can use in place of any TcpListener object.

TcpListenerEx tcpListener = new TcpListenerEx(localaddr, port);
like image 178
im_nullable Avatar answered Oct 27 '22 11:10

im_nullable


You can get this directly from the Socket. A Socket is always created when a TcpListener is instantiated.

        if(tcpListener.Server.IsBound)
            // The TcpListener has been bound to a port
            // and is listening for new TCP connections
like image 2
Rowan Smith Avatar answered Oct 27 '22 10:10

Rowan Smith