Передача данных через интернет

Я знаю, что эту тему задавали, я использовал много сообщений из Интернета, таких как codeproject, stackoverflow, но я все еще не могу передавать данные между двумя компьютерами, не входящими в локальную сеть.

Отличается ли передача по локальной сети или через Интернет? Должен ли я иметь временный сервер для выполнения этой задачи?

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

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

КОД: (только выполнить подключение)

Получить: (я установил это на машине моего друга)

namespace RecieveFile
{
public partial class Form1 : Form
{
#region Variables
    private Thread thrDownload;
    private Stream strLocal;
    private NetworkStream strRemote;
    private TcpListener tlsServer;
    #endregion
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {            
        thrDownload = new Thread(StartRecieving);
        thrDownload.Start();
   }
    public void StartRecieving()
    {
        try
        {
            string hstServer = Dns.GetHostName();
            IPAddress ipaLocal = Dns.GetHostEntry(hstServer).AddressList[0];
            if (tlsServer == null)
            {
                tlsServer = new TcpListener(IPAddress.Any, Convert.ToInt32(29250));                

            }
            tlsServer.Start();

            TcpClient tclServer = tlsServer.AcceptTcpClient();
            MessageBox.Show("Connection has been created");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        finally
        {
            strLocal.Close();
            strRemote.Close();
            MessageBox.Show("In finally");
            StartRecieving();
        }
    }
 }
}

Отправить: (я настроил это на своей машине)

private void Form1_Load(object sender, EventArgs e)
    {
     //171.255.9.234 is my friend's IP
     //if this ip is a ip of computer in my LAN network, it can work
        ConnectToSever("171.255.9.234", 29250);

    }
public void ConnectToSever(string severIP, int severPort)
    {
        tcpClient = new TcpClient();
        try
        {
            tcpClient.Connect(severIP, severPort);
            MessageBox.Show("Connection has been created!","Message");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }

person Đoàn Minh Tiến    schedule 08.11.2014    source источник
comment
Пожалуйста, покажите код, иначе это просто догадки для нас.   -  person deathismyfriend    schedule 08.11.2014
comment
Если предположить, что связь осуществляется через TCP/IP, с точки зрения кода приложения нет никакой разницы. С информацией, представленной здесь, никто на самом деле не сможет вам много сказать, но, тем не менее, это больше вопрос для Server Fault, хотя они тоже могут его отклонить.   -  person Preston Guillot    schedule 08.11.2014
comment
Спасибо за ваше уведомление, я уже добавил код, надеюсь, я смогу получить ответ.   -  person Đoàn Minh Tiến    schedule 09.11.2014


Ответы (2)


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

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

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

Аналогичным образом, если хост-сервер использует маршрутизатор NAT для подключения к Интернету (обычно для подключений к Интернету в жилых домах и на предприятиях малого и среднего бизнеса), необходимо будет настроить «переадресацию портов» маршрутизатора NAT для доставки входящего трафика через заданный порт на сервер. указанный компьютер. Аналогичная проблема возникает, если задействован прокси-сервер.

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

Все вышеперечисленное предполагает IPv4. Если вы используете IPv6 (все еще не распространенный в Интернете, но поддерживается сквозным доступом некоторыми интернет-провайдерами), то проблемы с прокси-сервером и NAT не должны быть проблемой, но брандмауэр все равно будет.

person Peter Duniho    schedule 08.11.2014
comment
При первом использовании программы появилось окно, я выбрал оба из двух вариантов (я помню, 1 разрешено для локальной сети и 1 разрешено для общего доступа). Была ли это конфигурация брандмауэра? Кто-то порекомендовал мне NAT, но я не могу понять, что это такое. Является ли NAT решением? Если это так, я изучу об этом. Спасибо за ваше уведомление! - person Đoàn Minh Tiến; 09.11.2014
comment
Да, это, вероятно, была ваша конфигурация брандмауэра. NAT — это то, что использует маршрутизатор (и, возможно, маршрутизатор вашего друга) для совместного использования одного интернет-соединения между несколькими компьютерами (или другими устройствами). NAT не является решением вашей проблемы; это, вероятно, то, что вызывает вашу проблему (но это решение других проблем, поэтому ваше решение не в том, чтобы избавиться от него... ваше решение заключается в правильной настройке маршрутизатора NAT). - person Peter Duniho; 09.11.2014
comment
Могу ли я настроить маршрутизатор NAT, написав код на C#? Я хотел бы запрограммировать программу, похожую на Teamviewer. Я обнаружил, что в Teamviewer есть служба «Вызов по IP» и «Копирование/вставка» между двумя компьютерами. Есть ли у него какой-либо временный сервер или виртуальная машина для выполнения этой задачи? Я думал, что это не так, потому что это бесплатно, поэтому я узнал о сокетах, методе TCP/IP, но не смог найти решение :( - person Đoàn Minh Tiến; 09.11.2014
comment
Я ничего не знаю о Teamviewer (что бы это ни было). Большинство маршрутизаторов NAT можно настроить программно с помощью Universal Plug-and-Play. Но я полагаю, что в данный момент это только усложнит вам жизнь. Вы должны быть знакомы с концепцией переадресации портов и с тем, как сначала вручную настроить хотя бы один маршрутизатор. - person Peter Duniho; 09.11.2014
comment
Спасибо за Ваш ответ! Я собираюсь изучить больше об этой проблеме. - person Đoàn Minh Tiến; 10.11.2014

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

Способ настройки переадресации портов зависит от ваших маршрутизаторов, но некоторую информацию можно найти на http://portforward.com/english/routers/port_forwarding/

person Mikael Engver    schedule 08.11.2014