Как найти доступный порт, прежде чем связывать сокет с конечной точкой?
Я разрабатываю сервер-клиентское приложение, которое использует 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++;
}
}
Ответы
Ответ 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
.