В C # для использования TcpClient или вообще для подключения к сокету, как я могу сначала проверить, свободен ли определенный порт на моей машине?
подробнее: это код, который я использую:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Ответы:
Поскольку вы используете a
TcpClient
, это означает, что вы проверяете открытые порты TCP. В пространстве имен System.Net.NetworkInformation доступно множество хороших объектов .Используйте
IPGlobalProperties
объект, чтобы перейти к массивуTcpConnectionInformation
объектов, который затем можно опросить об IP и порте конечной точки.источник
netstat -a -b
. Обратите внимание, чтоLISTENING
подключения отсутствуют в файлеGetActiveTcpConnections()
. Вам также следует пройти регистрацию,System.Net.IPEndPoints[]
возвращеннуюipGlobalProperties.GetActiveTcpListeners();
Вы не на том конце Intertube. Это сервер, на котором может быть открыт только один конкретный порт. Некоторый код:
Не работает с:
источник
Когда вы настраиваете TCP-соединение, 4-кортеж (source-ip, source-port, dest-ip, dest-port) должен быть уникальным - это необходимо для обеспечения доставки пакетов в нужное место.
На стороне сервера существует еще одно ограничение : только одна серверная программа может связываться с номером входящего порта (при условии одного IP-адреса; серверы с несколькими сетевыми картами имеют другие полномочия, но нам не нужно их здесь обсуждать).
Итак, на стороне сервера вы:
На стороне клиента это обычно немного проще:
Там нет не требуется, чтобы назначения IP / порт быть уникальным , так как это привело бы только один человек , в то время , будучи в состоянии использовать Google, и это будет очень хорошо разрушить их бизнес - модель.
Это означает, что вы даже можете делать такие чудесные вещи, как многосессионный FTP, поскольку вы настраиваете несколько сеансов, единственное отличие которых - ваш исходный порт, позволяющий загружать фрагменты параллельно. Торренты немного отличаются тем, что назначение каждой сессии обычно разное.
И, после всей этой болтовни (извините), ответ на ваш конкретный вопрос состоит в том, что вам не нужно указывать свободный порт. Если вы подключаетесь к серверу с вызовом, который не указывает ваш исходный порт, он почти наверняка будет использовать ноль под крышками, и система выдаст вам неиспользуемый.
источник
Вы неправильно поняли, что здесь происходит.
Параметры TcpClient (...) - это IP-адрес сервера и порт сервера, к которому вы хотите подключиться.
TcpClient выбирает временный локальный порт из доступного пула для связи с сервером. Нет необходимости проверять доступность локального порта, так как он автоматически обрабатывается уровнем winsock.
Если вы не можете подключиться к серверу с помощью приведенного выше фрагмента кода, проблема может быть в одной или нескольких из нескольких. (т.е. неверный IP-адрес и / или порт сервера, удаленный сервер недоступен и т. д.)
источник
Спасибо за этот совет. Мне нужна была такая же функциональность, но на стороне сервера, чтобы проверить, используется ли порт, поэтому я изменил его на этот код.
источник
-anb
) и без каких-либо параметров показывает внешнее соединение, а также состояние.спасибо за ответ jro. Мне пришлось настроить его для моего использования. Мне нужно было проверить, прослушивается ли порт, и не обязательно ли он активен. Для этого я заменил
с участием
Я повторил массив конечных точек, проверяя, что значение моего порта не найдено.
источник
источник
NetStat! Это сетевая утилита командной строки, которая поставляется с Windows. Он показывает все текущие установленные соединения и все порты, которые в настоящее время прослушиваются. Вы можете использовать эту программу для проверки, но если вы хотите сделать это из кода, посмотрите пространство имен System.Net.NetworkInformation? Это новое пространство имен начиная с версии 2.0. Там есть вкусности. Но в конечном итоге, если вы хотите получить такую же информацию, которая доступна через команду netstat, вам нужно будет привести к P / Invoke ...
Обновление: System.Net.NetworkInformation
Это пространство имен содержит набор классов, которые вы можете использовать для выяснения чего-либо о сети.
Мне не удалось найти этот старый кусок кода, но я думаю, что вы можете написать что-то подобное и сами. Хорошее начало - проверить IP Helper API . Google MSDN для функции GetTcpTable WINAPI и используйте P / Invoke для перечисления, пока у вас не будет нужной информации.
источник
Если я не сильно ошибаюсь, вы можете использовать System.Network.whatever для проверки.
Однако это всегда будет вызывать состояние гонки.
Канонический способ проверки - попытаться прослушивать этот порт. Если вы получили сообщение об ошибке, порт не был открыт.
Я думаю, что это отчасти объясняет, почему bind () и listen () - два отдельных системных вызова.
источник
Ты говоришь
Но вы всегда можете подключиться к порту, пока другие его используют, если что-то там слушает. В противном случае http-порт 80 был бы беспорядком.
Если ваш
терпит неудачу, значит, там ничего не слушает. В противном случае он подключится, даже если у какой-то другой машины / приложения есть сокет, открытый для этого IP-адреса и порта.
источник
ipGlobalProperties.GetActiveTcpConnections()
не возвращает соединения в состоянии прослушивания.Порт можно использовать для прослушивания, но если к нему никто не подключен, описанный выше метод работать не будет.
источник
Из доступных портов я бы исключил:
Со следующим импортом:
Вы можете использовать следующую функцию, чтобы проверить, доступен ли порт:
Я даю вам аналогичную функцию для тех, кто использует VB.NET :
источник
Чтобы ответить на точный вопрос о поиске свободного порта (который мне нужен в моих модульных тестах) в dotnet core 3.1, я придумал следующее
примечание: основываясь на комментарии @ user207421 о нулевом порте, я искал и нашел его и немного изменил его.
источник
Имейте в виду, что промежуток времени между проверкой и попыткой установить соединение может занять какой-либо процесс - классический TOCTOU . Почему бы тебе просто не попробовать подключиться? Если это не удается, значит, порт недоступен.
источник
Вам не нужно знать, какие порты открыты на вашем локальном компьютере, чтобы подключиться к какой-либо удаленной службе TCP (если вы не хотите использовать конкретный локальный порт, но обычно это не так).
Каждое TCP / IP-соединение идентифицируется 4 значениями: удаленный IP-адрес, номер удаленного порта, локальный IP-адрес, номер локального порта, но вам нужно знать только удаленный IP-адрес и номер удаленного порта, чтобы установить соединение.
Когда вы создаете TCP-соединение с помощью
Ваша система автоматически назначит вашему соединению один из многих свободных номеров локальных портов. Вам не нужно ничего делать. Вы также можете проверить, открыт ли удаленный порт. но нет лучшего способа сделать это, чем просто попытаться подключиться к нему.
источник
источник
источник
Проверьте код ошибки 10048
источник
попробуйте это, в моем случае номер порта для созданного объекта был недоступен, поэтому я придумал это
источник