Как получить IP-адрес и номер порта, назначенные .NET

#.net #vb.net #winforms #ip #port

#.net #vb.net #winforms #ip — адрес #порт #ip

Вопрос:

У меня есть два приложения Windows Forms, одно действует как сервер (то есть Winform: роль сервера), а другое как клиент (то есть Winform: роль клиента). В моей локальной сети установлено 6 компьютеров, и эти компьютеры подключены друг к другу через 8-портовый коммутатор, и на каждом КОМПЬЮТЕРЕ установлено более одной сетевой карты.

На одном компьютере работает [Winform: роль сервера], а на пяти других — [Winform: роль клиента]. В [Winform: роль сервера] я использую следующий код для получения локального IP-адреса и номера порта, а [Winform: роль сервера] будет прослушивать все входящие TCP-запросы в соответствии с этим автоматически назначенным IP-адресом и номером порта.

 Dim Listener As System.Net.Sockets.TcpListener
Dim Client As New System.Net.Sockets.TcpClient
Dim Message As String = ""

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Listener = New System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 0)
    Listener.Start()
End Sub
  

Как все [Winform: роль клиента] узнают мой [Winform: роль сервера] IP-адрес и номер порта во время выполнения?

Мне нужно уточнить свое намерение. Мой текущий подход к моему намерению, возможно, неверен. Я пытаюсь создать «сеть клиент-сервер нулевой конфигурации», и это подключи и играй. Сервер будет знать, где находится клиент, и наоборот. Я знаю, что есть программа (то есть MaxiVista), которая сделала именно это.

MaxiVista имеет два приложения, то есть сервер и клиент. Пользователям нужно только выполнить серверное приложение на компьютере, обозначенном как роль сервера, и выполнить клиентское приложение на другом КОМПЬЮТЕРЕ, обозначенном как роль клиента. Тогда сервер сможет находить всех выполняющихся клиентов в одной локальной сети.

Мое намерение именно в этом. Подключи и играй «сеть клиент-сервер нулевой конфигурации» в той же локальной сети.

Ответ №1:

Ну, на самом деле, они этого не делают.

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

Что вы могли бы использовать, так это своего рода сервисное объявление — например, через MDNS. Это работает за счет того, что сервер периодически объявляет «Я маленький сервер, короткий и крепкий (сервер того, что называется Yourappiscalled на порту 12345)», а ваши клиенты прослушивают такие запросы или даже запрашивают их («есть ли здесь сервер того, что называется Yourappiscalled?»).). Смотрите также это:http://en.wikipedia.org/wiki/Zero_configuration_networking#Service_discovery

(В крайнем случае, вы могли бы заставить сервер транслировать свое присутствие в сеть и заставить клиентов прослушивать такие трансляции, но тогда вы в основном повторно внедряете MDNS)

Ответ №2:

У клиентов нет возможности автоматически определять IP-адрес сервера. Вот несколько вариантов решения вашей проблемы:

  • У каждого клиента есть какие-то данные инициализации, которые сообщают ему, где расположен сервер (это может быть база данных, ini-файл и т.д.). Эти данные, вероятно, будут храниться локально.
  • У сервера есть какие-то данные инициализации, которые сообщают ему, где находятся клиенты. Затем сервер может использовать эту информацию либо для прямой связи с клиентом каким-либо образом, либо для записи своего собственного IP-адреса в файл / базу данных на клиентском компьютере, который ищет клиент.

Ответ №3:

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

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

Комментарии:

1. Я пытаюсь создать «сеть клиент-сервер нулевой конфигурации», и это подключи и играй. Сервер будет знать, где находится клиент, и наоборот. Я знаю, что есть программа (например, MaxiVista), которая сделала именно это.

2. Хм, вам придется написать совершенно другой код. Например, периодически транслировать объявление о доступности сервиса по всей локальной сети с помощью UDP. Это программное обеспечение стоимостью в сто долларов для решения проблемы стоимостью в один доллар.

3. это «особенность» моего приложения, то есть удобное программное обеспечение

4. Хм, я думал, ты ищешь программное обеспечение, удобное для программиста. Nvm.