Нужна помощь с сокетами C # - подключение работает локально, но не из другой сети - PullRequest
0 голосов
/ 18 марта 2011

Я делаю многопользовательскую игру в XNA 4.0 с использованием классов сокетов .NET.

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

Однако, когда я попытался соединиться между двумя разными сетями (сервер был у меня дома, а клиент работал в доме моего друга, который живет 5 минутпрочь) клиент не может подключиться.

Я использовал метод Socket.BeginConnect (), и .NET не выдавал никаких исключений (если целевой компьютер отклонил соединение, то .NET выкинул быSocketException) На обоих компьютерах не было брандмауэров.

Есть идеи, почему это произошло?

Вот фрагмент моего кода:

    public void connect(String ipAddress, int port)
    {
        lock(_locker)
        {
            if (!_connecting)
            {
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);

                try
                {
                    _socket.BeginConnect(endpoint, doConnect, null);
                    _connecting = true;
                } catch (SocketException e)
                {
                    // what happen? SOMEONE SET US UP THE BOMB!
                }
            }
        }

    }

1 Ответ

2 голосов
/ 18 марта 2011

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

Чтобы маршрутизатор мог принимать входящие соединения с данным портом и передавать их на одну из машин, подключенных к маршрутизатору, вашему другу потребуется настроить переадресацию портов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...