2016-08-14 12 views
0

Я сделал несколько игр в VB успешно и теперь готов перейти к попытке создания многопользовательских игр. Однако, поскольку у меня нет опыта в этом, и я могу найти немного в Интернете, чтобы помочь мне, у меня есть проблема, с которой я не могу найти решение. Я использую VB в качестве языка, хотя я поставил c# в тегах, потому что вместо этого я могу понять решения, использующие его.Использование класса TCPClient: «Не удалось установить соединение, потому что целевая машина активно отказалась от него»

Я попытался сделать игру 2-х игроков, используя TCP для соединения между игроками.

Он использует TcpListener класса для серверного кода и TcpClient класса для кода клиента и в значительной степени использует шаблон, который й документацию дает: server, client.

Сервер:

server = New TcpListener(IPAddress.Any, 48000) 

И клиент:

Dim client As New TcpClient() 
client.Connect(hostAddr, 48000) 

Я тестируя код, используя как сервер и клиент на той же машине. Код работает отлично, когда я делаю hostAddr локальный IP-адрес моего компьютера, и я могу успешно отправлять сообщения между двумя программами.

Однако, когда я даю hostAddr мой внешний IP-адрес, клиентский код не работает из-за ошибки: «Никакое соединение не может быть сделано, потому что целевая машина активно отказалась от него».

Я попытался следующие, которые не работают для меня:

  1. Выключение брандмауэра

  2. Изменение мои настройки маршрутизатора, чтобы разрешить соединения TCP через все порты

Я использую Windows 10 в VM (надеюсь, это не повлияет на вещи).

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

ответ

1

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

Следующая сетевая проблема может быть вашей конфигурацией HyperV. По-моему, по умолчанию HyperV создает «частный» сетевой коммутатор, что означает, что почти каждая гостевая ОС может говорить только с собой. Вы можете создать коммутатор, чтобы только виртуальные машины могли разговаривать друг с другом, но для разработки я обычно выбираю коммутатор, который предоставляет сетевую карту хоста, а любой гость, использующий этот гипервикер, будет рассматриваться как просто другой компьютер в вашей сети, как будто они были физическими.

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

+0

Я использую тот же самый компьютер, поэтому просто отключить брандмауэр должен работать (для 1-й части)? – Shuri2060

+0

Кроме того, я использую VirtualBox для своей виртуальной машины и думал, что это будет то же самое, что использовать реальный компьютер, поскольку он может подключиться к Интернету. Думаю, это не так? – Shuri2060

+0

Спасибо! Я исправил проблему с помощью переадресации портов через виртуальную машину - оказалось, что это действительно проблема – Shuri2060