Подтвердить что ты не робот

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

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

вот немного объяснений:

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

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

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

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

Ответ 1

Если номер порта не имеет значения, вы можете передать 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.