Странный C # SocketException - PullRequest
       4

Странный C # SocketException

1 голос
/ 19 марта 2011

Во время тестирования моей программы клиент-сервер я столкнулся со странным исключением при попытке подключиться к серверу на другом маршрутизаторе:

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

Клиент может прекрасно подключаться к серверу в локальной сети, однако он не работает, когда подключен к Интернету.

Я портирую перенаправленный порт 1250 (тот, который я использую), и использую SimplePortForwarding (http://www.simpleportforwarding.com/) Я проверил, что порт открыт и работает.

Я основал свою реализацию на этом уроке: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/

Есть идеи, что не так? Спасибо!

Вот метод прослушивания сервера:

    public void startListening(int port)
    {
        lock(_locker)
        {
            _listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // Bind socket to local endpoint, and listen for incoming connections
                IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, port);
                _listeningSocket.Bind(ipEndpoint);
                _listeningSocket.Listen(10);

                waitForNewClient();

                // successfully started listening
                _isListening = true;

            } catch (SocketException e)
            {
                // failed for some strange reason
                _isListening = false;
            }
        }
    }

Вот код подключения клиента:

    public String 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.Connect(endpoint);
                    _connected = true;
                    waitForData();

                    _eventManager.queueEvent(new PlayerJoinedEvent(PlayerJoinedEvent.PLAYER_JOINED, name));
                } catch (SocketException e)
                {
                    // Exception is thrown HERE
                    return e.Message;
                }
            }
        }

        return "";
    }

Ответы [ 3 ]

0 голосов
/ 19 марта 2011

Убедитесь, что IP-адрес вашего сервера равен public , если он недоступен.

Проверьте эту ссылку для частных адресных пространств.

0 голосов
/ 20 марта 2011

Я исправил проблему.

IP-адрес, который я использовал, был внутренним IP-адресом, который я получил от ipconfig, но IP-адрес, который мне нужно было использовать, был внешним, тот, который вы получаете от таких служб, как http://www.whatsmyip.org/.

Я все еще не понимаю, почему эти два числа отличаются.

0 голосов
/ 19 марта 2011

Вы открыли порт 1250 на сервере или клиентском роутере? Его нужно открыть на сервере-роутере. Возможно, вам необходимо убедиться, что ваш сервер подключен к вашему порту DMZ и / или на вашем маршрутизаторе сервера включена DMZ.

Надеюсь, это поможет.

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