Как найти доступный порт, прежде чем связать сокет с конечной точкой? - PullRequest
14 голосов
/ 27 марта 2012

Я разрабатываю сервер-клиентское приложение, которое использует 3 порта [TCP SOCKET .Net 4.0] ..
Таким образом, приложение дает пользователю возможность установить порт только для основного сокета. но я хочу позволить серверному приложению автоматически находить доступный порт для двух других сокетов, чтобы оно отправляло значение порта клиенту, используя соединение с главным сокетом. затем клиент подключается к другому сокету, используя полученное значение порта.

вот небольшое объяснение:

основной сокет прослушивает настраиваемый порт. этот сокет принимает клиента для запуска команд отправки / получения. (файловый менеджер / менеджер задач / свойства / завершение работы / чат) второй сокет предназначен для передачи файлов только для передачи файлов и закрывается по завершении. третий сокет предназначен только для получения / отправки скриншота .

[я знаю, вы могли бы сказать, что я должен использовать один и тот же сокет для передачи файлов и скриншота, но это немного сложно. я просто использую отдельные сокеты для каждого из них.]

Так как мне найти доступный порт, прежде чем связывать сокет с конечной точкой? как то так:

int port = 10000;
bool isAvailable = false;
while(!isAvailable)
{
    try
    { 
        // check if the port is available to use.
        isAvailable = true;
    }
    catch
    {
        port++;
    }
} 

1 Ответ

29 голосов
/ 27 марта 2012

Если номер порта не имеет значения, вы можете передать 0 для порта на IPEndPoint. В этом случае операционная система (стек TCP / IP) назначает вам свободный номер порта.

Socket sock = new Socket(AddressFamily.InterNetwork,
                         SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 0)); // Pass 0 here.

Console.Out.WriteLine("Assigned port: {0}",
                      ((IPEndPoint)sock.LocalEndPoint).Port);

Как указал @GrokSrc в разделе комментариев, вы, конечно, должны располагать сокетом, когда вы закончите с сокетом, используя метод Dispose() или оператор using.

...