Last active
January 5, 2023 19:07
-
-
Save AndrewSav/8dd0c4c317df7ce35cb75ed0d2caeefa to your computer and use it in GitHub Desktop.
TCP Port Listener
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is a very basic TCP port listener that allows you to listen on a port range | |
// If you run this program outside of firewall and run a port scanner inside a firewall | |
// pointing to the ip address where this program runs, the port scanner will be able you | |
// to tell which exactly ports are open on the firewall | |
// This code will run on Windows, but most importantly also on linux. | |
// DigitalOcean.com has all ports for their VMs open by default. So spin a new VM, | |
// copy pln.cs in your (root) home folder and then run: | |
// sudo apt-get update | |
// sudo apt-get install mono-complete -y | |
// mcs pln.cs | |
// ulimit -n 66000 | |
// ./pln.exe 1 65535 | |
// Now you can use the VM ip address to determine open ports on your firewall | |
// Note that this is a dev utility, and is aimed to be minimal - no input validation, | |
// no error handling. In case of a error stack trace is dumpled to console | |
using System; | |
using System.Net; | |
using System.Net.Sockets; | |
namespace PortListener | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
try | |
{ | |
Console.WriteLine("Usage: pln.exe startPort [endPort]"); | |
Listen(args); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine("Error: " + ex); | |
} | |
} | |
private static void Listen(string[] args) | |
{ | |
int startPort = int.Parse(args[0]); | |
int endPort = int.Parse(args[1]); | |
Console.WriteLine("Started binding..."); | |
for (int i = startPort; i <= endPort; i++) | |
{ | |
if (i % 100 == 0 && Environment.OSVersion.Platform != PlatformID.Unix) | |
{ | |
Console.WriteLine("Binding port " + i); | |
} | |
TcpListener listener = new TcpListener(IPAddress.Any, i); | |
try | |
{ | |
listener.Start(); | |
} | |
catch (SocketException ex) | |
{ | |
if (ex.SocketErrorCode == SocketError.AddressAlreadyInUse) | |
{ | |
Console.WriteLine("Port " + i.ToString() + " already in use"); | |
continue; | |
} | |
if (ex.SocketErrorCode == SocketError.AccessDenied) | |
{ | |
Console.WriteLine("Access denied to port " + i.ToString()); | |
continue; | |
} | |
throw; | |
} | |
listener.BeginAcceptSocket(DoAcceptSocketCallback, listener); | |
} | |
Console.WriteLine("Finished binding. Ctrl-C to stop."); | |
Console.ReadLine(); | |
} | |
private static void DoAcceptSocketCallback(IAsyncResult ar) | |
{ | |
TcpListener listener = (TcpListener) ar.AsyncState; | |
listener.EndAcceptSocket(ar).Close(); | |
Console.WriteLine("Connection on port " + ((IPEndPoint) listener.LocalEndpoint).Port.ToString()); | |
listener.BeginAcceptSocket(DoAcceptSocketCallback, listener); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment