Loopback/Localhost Вопрос

у меня вопрос о сокетах/клиентах....

Я только что закончил писать клиент-серверную программу на C#. Мне было интересно, как вы подключаетесь к компьютерам с другим IP-адресом. Например, если я хочу запустить клиент и сервер отдельно на двух разных машинах, петля (или использование локального хоста) не позволит этого....

Не слишком знаком с сетью, любая помощь будет принята с благодарностью. Вот мой код на стороне клиента, который имеет дело с обратной связью:

TcpClient client = new TcpClient();

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);

person BigBug    schedule 22.09.2011    source источник


Ответы (3)


Вам просто нужно знать IP-адрес сервера и указать его в коде на стороне клиента.

Вы можете получить свой IP-адрес, набрав ipconfig /all в командной строке. Обратите внимание, что это даст вам только подключение к локальной сети.

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

Если у вас есть маршрутизатор, вам нужно перенаправить порт на машину, на которой запущена ваша служба. Найдите преобразование сетевых адресов и ознакомьтесь с документацией для своего маршрутизатора или позвоните в службу технической поддержки. Или погуглите "как пробросить порты?".

После того, как вы настроили свою сеть и узнали всю информацию о своем подключении, при условии, что вы используете TcpListener:

person Merlyn Morgan-Graham    schedule 22.09.2011
comment
Извините, не могли бы вы еще раз объяснить это, и если у вас есть маршрутизатор, вам нужно будет перенаправить порт на машину, на которой работает ваша служба. Я думаю, что это то, что я не совсем понимаю, как это сделать... спасибо за ответ! - person BigBug; 22.09.2011
comment
Кстати, хотя это и научит вас основам, я бы не стал писать большинство программ таким образом, если бы не был очень придирчив к тому, как выглядит сетевой поток. Вместо этого я бы использовал веб-сервисы. Их намного легче кодировать. - person Merlyn Morgan-Graham; 22.09.2011
comment
@BlueButtons: Объяснение того, как работает NAT, и техническая поддержка вашего маршрутизатора выходят за рамки того, что вы просили. К программированию это тоже не имеет никакого отношения. Вам нужно будет ознакомиться с документацией на маршрутизатор или позвонить в их техподдержку. Узнайте IP-адрес машины, на которой работает ваша служба, узнайте, какой порт вы использовали, и перенаправьте этот порт на этот IP-адрес. Это делает так, что когда кто-то отправляет пакет на ваш маршрутизатор через порт 8888, он перенаправляет его прямо на ваш сервер, даже если ваш сервер не отправил пакет первым. - person Merlyn Morgan-Graham; 22.09.2011
comment
@BlueButtons: Если вы делаете это в своей локальной сети (не через Интернет), вам не о чем беспокоиться. Просто используйте ipconfig /all и узнайте свой IP :) Нет необходимости в переадресации портов. - person Merlyn Morgan-Graham; 22.09.2011
comment
Большое спасибо за ответ! Мне это очень помогло :о) - person BigBug; 22.09.2011
comment
@BlueButtons: Круто :) Я ответил на все ваши вопросы (по программированию)? Использовали ли вы тип, отличный от TcpListener, для реализации сервера? - person Merlyn Morgan-Graham; 22.09.2011

Решение OverMars не очень хорошее, потому что сторонние веб-сайты, такие как ipchicken, предоставят вам ваш IP-адрес WAN. Локальные соединения не будут работать. Посмотрите NAT (преобразование сетевых адресов), если вам нужна дополнительная информация.

Просто привяжите к «любому» адресу, если вы хотите подключить отдельную машину.

TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Any, 8888);

Обратите внимание, что «Любой» переводится как адрес «0.0.0.0».

person feathj    schedule 22.09.2011

127.0.0.1 — это внутренний адрес «этого компьютера» или устройства, на котором запущено приложение. Каждый компьютер будет иметь 127.0.0.1 и как минимум 1 другой IP-адрес в современной сети.

Чтобы узнать IP-адрес другого компьютера с Windows, вы можете использовать ipconfig из командной строки. Вы получите что-то вроде этого:

IP-конфигурация Windows

Ethernet adapter Local Area Connection:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 10.0.0.2
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 10.0.0.1

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

TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("10.0.0.2"), 8888);  
client.Connect(serverEndPoint);

Компьютер Windows также будет иметь имя, такое как JimsPC или JimsPC.abc.com, которое также можно использовать в конструкторе TcpClient или в методах BeginConnect, Connect, подобных этому.

TcpClient client = new TcpClient("JimsPC", 8888);

or

TcpClient client = new TcpClient();
client.Connect("JimsPC", 8888);
person Bernie White    schedule 22.09.2011
comment
Спасибо, этот пост еще больше прояснил для меня некоторые вещи. Очень ценю!! - person BigBug; 22.09.2011
comment
Используя ipconfig, я нашел адрес шлюза по умолчанию, и у моей программы возникают проблемы с подключением к нему. Я продолжаю получать эту ошибку: SocketException не обработано. Соединение установить не удалось, потому что целевая машина активно отказывалась от него... - person BigBug; 22.09.2011
comment
@BlueButtons: Адрес шлюза по умолчанию — вероятно ваш маршрутизатор. Вам нужен IP Address, который в примере будет 10.0.0.2. Это, конечно, будет другим значением в вашей сети. - person Merlyn Morgan-Graham; 22.09.2011
comment
+1; Хорошая информация об использовании имени хоста машины. @BlueButtons: обратите внимание, что вы сможете использовать это имя компьютера (называемое hostname) в локальной сети, но не в Интернете (если вы не заплатите за службы DNS, которые заставляют его работать — обычно это называется регистрацией домена и, возможно, регистрацией поддомена). - person Merlyn Morgan-Graham; 22.09.2011
comment
ОХ! Извините, я не заметил тонкой разницы в цифрах. Спасибо :о) - person BigBug; 22.09.2011
comment
Я рад, что это помогло. Я выделю .2 жирным шрифтом, чтобы его было легче читать. - person Bernie White; 22.09.2011