В C#, как проверить, доступен ли порт TCP?

Его можно использовать для изменения последовательности навигации по фокусу элемента формы по умолчанию.

Итак, если у вас есть:

text input A

text input B

submit button C

с помощью клавиши табуляции, вы перемещаетесь по A -> В-> С. Tabindex позволяет вам изменять этот поток.

115
задан Ali 20 February 2009 в 16:16
поделиться

12 ответов

Так как Вы используете TcpClient, который означает, что Вы проверяете открытые порты TCP. Существует много хороших объектов, доступных в Система. Сеть. Пространство имен NetworkInformation .

Использование эти IPGlobalProperties объект добраться до массива TcpConnectionInformation объекты, которые можно затем опросить о IP конечной точки и порте.

<час>
 int port = 456; //<--- This is your value
 bool isAvailable = true;

 // Evaluate current system tcp connections. This is the same information provided
 // by the netstat command line application, just in .Net strongly-typed object
 // form.  We will look through the list, and if our port we would like to use
 // in our TcpClient is occupied, we will set isAvailable to false.
 IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
 TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

 foreach (TcpConnectionInformation tcpi in tcpConnInfoArray)
 {
   if (tcpi.LocalEndPoint.Port==port)
   {
     isAvailable = false;
     break;
   }
 }

 // At this point, if isAvailable is true, we can proceed accordingly.
206
ответ дан Soner Gönül 5 November 2019 в 09:05
поделиться

ipGlobalProperties.GetActiveTcpConnections() не возвращается, соединения в Слушают состояние.

Порт может использоваться для слушания, но без одного связанного с ним выше не будет работать метод, описанный.

2
ответ дан Tevo D 5 November 2019 в 09:05
поделиться

netstat! Это - сетевая утилита командной строки, которая поставлется с окнами. Это, в настоящее время показывает все текущие установленные соединения и все порты слушаясь. Можно использовать эту программу для проверки, но если Вы хотите сделать, это из кода изучает Систему. Сеть. Пространство имен NetworkInformation? Это - новое пространство имен с 2,0. Там существуют некоторые положительные герои. Но в конечном счете если Вы хотите получить тот же вид информации, это доступно посредством команды netstat, необходимо будет закончиться к P/Invoke...

Обновление: Система. Сеть. NetworkInformation

, Что пространство имен содержит набор классов, которые можно использовать для выяснения вещей о сети.

я не смог найти, что старая пайса кода, но я думаю, что можно записать что-то подобное сами. Хорошее начало должно проверить помощник API IP. MSDN Google для функция GetTcpTable WINAPI и использование P/Invoke для перечисления, пока у Вас нет информации, в которой Вы нуждаетесь.

3
ответ дан John Leidegren 5 November 2019 в 09:05
поделиться

Вы находитесь на неправильном конце Межтрубы. Это - сервер, который может иметь только один конкретный открытый порт. Некоторый код:

  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
  try {
    TcpListener tcpListener = new TcpListener(ipAddress, 666);
    tcpListener.Start();
  }
  catch (SocketException ex) {
    MessageBox.Show(ex.Message, "kaboom");
  }

Сбои с:

Только одно использование каждого адреса сокета (адрес/порт протокола/сети) обычно разрешается.

43
ответ дан Hans Passant 5 November 2019 в 09:05
поделиться
string hostname = "localhost";
int portno = 9081;
IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0];


try
{
    System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
    sock.Connect(ipa, portno);
    if (sock.Connected == true)  // Port is in use and connection is successful
            MessageBox.Show("Port is Closed");
    sock.Close();

}
catch (System.Net.Sockets.SocketException ex)
{
    if (ex.ErrorCode == 10061)  // Port is unused and could not establish connection 
        MessageBox.Show("Port is Open!");
    else
        MessageBox.Show(ex.Message);
}
5
ответ дан Learning 5 November 2019 в 09:05
поделиться

Вы говорите

, я подразумеваю, что это не используется никаким другим приложением. Если приложение использует порт другие, не может использовать его, пока это не становится свободным.

, Но можно всегда соединяться с портом, в то время как другие используют его, если что-то слушает там. Иначе, http порт 80 была бы путаница.

, Если Ваш

   c = new TcpClient(ip, port);

сбои, то ничто не слушает там. Иначе это соединится, даже если некоторая другая машина/приложение будет иметь сокет, открытый для того IP и порта.

2
ответ дан Moose 5 November 2019 в 09:05
поделиться
TcpClient c;

//I want to check here if port is free.
c = new TcpClient(ip, port);

... как я могу сначала проверить, свободен ли определенный порт на моей машине?

Я подразумеваю, что это не используется никаким другим приложением. Если приложение использует порт другие, не может использовать его, пока это не становится свободным. – Ali

Вы неправильно поняли то, что происходит здесь.

TcpClient (...) параметры имеют IP сервера и порт сервера, с которым Вы хотите соединиться.

TcpClient выбирает переходный локальный порт из доступного пула для передачи с сервером. Нет никакой потребности проверить на доступность локального порта, поскольку это автоматически обрабатывается winsock слоем.

В случае, если Вы не можете соединиться с сервером с помощью вышеупомянутого фрагмента кода, проблемой мог быть один или несколько из нескольких. (т.е. IP сервера и/или порт являются неправильным, удаленным сервером, не доступным и т.д.)

15
ответ дан Indy9000 24 November 2019 в 02:21
поделиться

При установке соединения TCP с 4 кортежами (исходный IP, исходный порт, dest-ip, dest-порт) должен быть уникальным - это должно гарантировать, что пакеты поставляются правильному месту.

Существует дальнейшее ограничение на сторону сервера, которую только одна программа сервера может связать с числом входящего порта (принимающий один IP-адрес; серверы мульти-NIC имеют другие полномочия, но мы не должны обсуждать их здесь).

Так, в конце сервера, Вас:

  • создайте сокет.
  • свяжите тот сокет с портом.
  • послушайте на том порте.
  • примите соединения на том порте. и могут быть входящие многочисленные связи (один на клиент).

На клиентском конце это обычно немного более просто:

  • создайте сокет.
  • откройте соединение. Когда клиент открывает соединение, оно указывает IP-адрес и порт сервера. Это может указать свой исходный порт, но обычно использует нуль, который приводит к системе, присваивающей его франко-порт автоматически.

Нет никакого требования, что целевой IP/порт быть уникальным, так как это привело бы только к одному человеку в способности времени использовать Google, и это вполне прилично уничтожит их бизнес-модель.

Это означает, что можно даже сделать такие поразительные вещи как многосеансный FTP, так как Вы настраиваете несколько сессий, где единственной разницей является Ваш исходный порт, позволяя Вам загрузить блоки параллельно. Потоки немного отличаются в этом, место назначения каждой сессии обычно отличается.

И, после весь этот (жаль) колеблющийся, ответ на Ваш конкретный вопрос - то, что Вы не должны указывать франко-порт. Если Вы соединитесь с сервером с вызовом, который не указывает Ваш исходный порт, то он будет почти наверняка использовать нуль под покрытиями, и система даст Вам неиспользованный.

19
ответ дан paxdiablo 24 November 2019 в 02:21
поделиться

Имейте в виду, что временной интервал между проверкой и моментом установления соединения каким-либо процессом может занять порт - классический TOCTOU . Почему бы вам просто не попробовать подключиться? Если произойдет сбой, вы знаете, что порт недоступен.

1
ответ дан ya23 24 November 2019 в 02:21
поделиться

Если я не сильно ошибаюсь, вы можете использовать System.Network.whither для проверки.

Однако Это всегда приводит к состоянию гонки.

Канонический способ проверки - попытаться прослушать этот порт. Если вы получаете сообщение об ошибке, что порт не был открыт.

Я думаю , это является частью того, почему bind () и listen () являются двумя отдельными системными вызовами.

2
ответ дан 24 November 2019 в 02:21
поделиться

Using jQuery 1.3.2 the following worked for me:

$('iframe').ready(function() {
  $('body', $('iframe').contents()).html('Hello World!');
});

REVISION:! Actually the above code sometimes looks like it works in Firefox, never looks like it works in Opera.

Instead I implemented a polling solution for my purposes. Simplified down it looks like this:

$(function() {
  function manipIframe() {
    el = $('body', $('iframe').contents());
    if (el.length != 1) {
      setTimeout(manipIframe, 100);
      return;
    }
    el.html('Hello World!');
  }
  manipIframe();
});

This doesn't require code in the called iframe pages. All code resides and executes from the parent frame/window.

--121 --- 633578--

Вам не нужно знать, какие порты открыты на вашем локальном компьютере для подключения к какой-либо удаленной службе TCP (если вы не хотите использовать определенный локальный порт, но обычно это не так. случай).

Каждое соединение TCP / IP идентифицируется 4 значениями: удаленный IP, номер удаленного порта, локальный IP, номер локального порта, но вам нужно знать только удаленный IP и номер удаленного порта, чтобы установить соединение.

Когда вы создаете tcp-соединение, используя

TcpClient c;
c = new TcpClient(remote_ip, remote_port);

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

1
ответ дан 24 November 2019 в 02:21
поделиться

спасибо за ответ jro. Мне пришлось подправить его для моего использования. Мне нужно было проверить, прослушивается ли порт, но не обязательно активен. Для этого я заменил

TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

на

IPEndPoint[] objEndPoints = ipGlobalProperties.GetActiveTcpListeners();.  

Я итерировал массив конечных точек, проверяя, что мое значение порта не найдено.

6
ответ дан 24 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: