Не удается подключить сокеты через интернет - PullRequest
5 голосов
/ 19 ноября 2011

Оглавление

  • Предисловие
  • Код сервера
  • Код клиента
  • Пример локального компьютера ( Успешно )
  • Пример сети Интернет ( Неуспешно )
  • Мои соображения о возможностях

Предисловие

Я беру эти коды из класса MSDNбиблиотечные примеры.Так что должно работать правильно.Да, я частично прав.При запуске на моем компьютере это удается.Но через интернет-сеть это терпит неудачу.Я беру ConnectionRefused SocketErrorCode каждый раз.
Я приведу исходный код ниже, сначала вы должны знать мои измененные тесты.

Для кода сервера:

  • Я использовал IPAddress.IPv6Any вместо IPAddress.Any .
  • Также я пытался без server.AllowNatTraversal (true)

Но это не удалось

Код сервера

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ServerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener server = null;
            try
            {
                int port = 13000;
                server = new TcpListener(IPAddress.Any, port);
                server.AllowNatTraversal(true);
                server.Start();
                byte[] bytes = new byte[256];
                string data = null;
                while (true)
                {
                    Console.WriteLine("Waiting for a connection...");
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected: {0}", client.Client.LocalEndPoint.ToString());
                    data = null;
                    NetworkStream stream = client.GetStream();
                    int i;
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        data = Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);
                        data = data.ToUpper();
                        byte[] msg = Encoding.ASCII.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}", data);
                    }
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("Socket exception message: {0}", e.Message);
                Console.WriteLine("Socket Error Code: {0}", e.SocketErrorCode.ToString());
            }
            finally
            {
                server.Stop();
            }
            Console.WriteLine("\nHit enter to continue...");
            Console.ReadKey();            
        }
    }
}

Код клиента

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace ClientTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Started...");
            Console.WriteLine("İP Address:");
            string hostName = Console.ReadLine();
            if(hostName.Length == 0)
            {
                hostName = Dns.GetHostName();
            }
            Connect(hostName, "hello");
        }

        static void Connect(string server, string message)
        {
            try
            {
                int port = 13000;
                TcpClient client = new TcpClient(server, port);
                byte[] data = Encoding.ASCII.GetBytes(message);
                NetworkStream stream = client.GetStream();
                stream.Write(data, 0, data.Length);
                Console.WriteLine("Sent: {0}", message);
                data = new byte[256];
                string responseData = string.Empty;
                int bytes = stream.Read(data, 0, data.Length);
                responseData = Encoding.ASCII.GetString(data, 0, bytes);
                Console.WriteLine("Received: {0}", responseData);
                stream.Close();
                client.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e.Message);
            }
            catch (SocketException e)
            {
                Console.WriteLine("Socket Error Code: {0}", e.SocketErrorCode.ToString());
            }
            Console.WriteLine("Hit enter to continue...");
            Console.ReadKey();
        }
    }
}

Пример локального компьютера ( Успешно )

Я пробовал только на своем компьютере.Сначала я открыл программу ServerTest , затем запустил программу ClientText .

Выход клиента

Запущено ...
Адрес IP:

Отправлено привет
Получено Привет
Нажмите Enter, чтобы продолжить

Вывод на сервер

Ожидание соединения ...
Connected: 192.168.1.3:13000
Получено: hello
Отправлено: HELLO
Ожидание соединения

Пример Интернет-сети ( Unsuccessfull )

Я пытался с моим другом, чей IP-адрес "88.226.0.218".Он узнал свой IP-адрес из whatismyipaddress.com Я запустил ClientTest и запустил ServerTest .Ниже приведены выходные данные:

Выход клиента

Запущено ...
IP-адрес:
88.226.0.218
SocketErrorCode: ConnectionRefused
Нажмите Enter, чтобы продолжить

Вывод на сервер

Ожидание соединения ...

И ничего. ServerTest Программа только ждет.

Мои соображения о возможностях

  • Может использоваться только İPv6, когда я использовал İPAddress.İPv6Any
  • Мой модемный брандмауэр может предотвращать NatTraversal.Если да, как я могу включить модем NatTraversal программно?
  • AllowNatTraversal метод класса TcpListener , поставляемый с .Net4, не работает должным образом.(Я не верю, но ради возможности)

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

1 Ответ

0 голосов
/ 04 июля 2012

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

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

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

Дополнительную информацию (и руководства!) О брандмауэрах и переадресации портов можно найти здесь: http://portforward.com/help/start_here.htm

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