【问题标题】:Data transfer through internet通过互联网传输数据
【发布时间】:2014-11-08 18:40:56
【问题描述】:

我知道有人问过这个话题,我使用了很多来自互联网的帖子,例如 codeproject、stackoverflow,但我仍然无法在不在 LAN 网络上的两台计算机之间传输数据。

局域网传输和互联网传输有区别吗?我必须有一个临时服务器来完成这项任务吗?

我的程序在 LAN 网络上运行,但是当我尝试在 WAN 网络中测试程序时,我在离我很远的朋友的计算机上设置了服务器(接收),然后,在我的计算机中,在客户端程序中,我替换了局域网的IP由我朋友电脑的IP,但它不起作用。我误解了什么吗?

如果您不明白我的意思,请给我解决方案的链接或教我如何在不在 LAN 计算机上的 2 台计算机之间传输数据。非常感谢你,对不起我的英语不好。

代码:(仅建立连接)

接收:(我在朋友的机器上设置了这个)

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);
        }
    }

【问题讨论】:

  • 请出示代码,否则这只是我们的猜测。
  • 假设通过 TCP/IP 进行通信,从应用程序代码的角度来看没有任何区别。有了这里提供的信息,没有人真的能告诉你太多,但无论如何这更多是关于服务器故障的问题,尽管他们也可能会拒绝它。
  • 感谢您的通知,我已经添加了代码,希望我能得到答案。

标签: c# networking data-transfer


【解决方案1】:

如前所述,没有实际的代码示例,就不可能做出具体的陈述。

也就是说,代码在 LAN 上运行但不能在 Internet 上运行的通常原因是连接的服务器端位于代理、NAT 路由器或防火墙之后。

如果服务器主机运行防火墙,您必须确保防火墙设置已配置为允许网络流量通过您期望的端口。使用 Windows 防火墙,默认情况下,Windows 将在您首次运行未经授权的程序时显示提示,允许您授予访问权限。 Windows 上的不同防火墙软件,当然还有其他操作系统上的不同防火墙,可能会或可能不会类似地工作。

同样,如果服务器主机使用 NAT 路由器进行 Internet 连接(常见于住宅和中小型企业 Internet 连接),则需要配置 NAT 路由器的“端口转发”以在给定的端口到指定的计算机。如果涉及代理服务器,也会存在类似问题。

另外请注意,如果涉及到 NAT 路由器或代理,您需要在客户端软件中配置为服务器地址的 IP 地址不是用于托管的实际机器的 IP 地址服务器进程(将是 LAN 地址),而是 NAT 路由器或代理服务器使用的面向 Internet 的地址。

以上所有内容均假设 IPv4。如果您使用 IPv6(在 Internet 上仍然不常见,但某些 Internet 提供商支持端到端),那么代理和 NAT 问题应该不是问题,但防火墙仍然是问题。

【讨论】:

  • 第一次使用该程序时,会出现一个窗口,我选择了2个选项(我记得1个允许LAN和1个允许公共),是防火墙配置吗?有人向我推荐 NAT,但我无法真正理解它是什么。 NAT是解决方案吗?如果是,我会研究它。感谢您的通知!
  • 是的,这可能是您的防火墙配置。 NAT 是路由器(也可能是您朋友的路由器)用来在多台计算机(或其他设备)之间共享单个 Internet 连接的工具。 NAT 不是解决你的问题的方法;这可能是导致您的问题的原因(但它是解决其他问题的方法,因此您的解决方案不是摆脱它...您的解决方案是正确配置 NAT 路由器)。
  • 我可以通过C#编码来配置NAT路由器吗?我想编写一个类似于 Teamviewer 的程序。我发现 Teamviewer 具有“通过 IP 呼叫”服务,并且可以轻松地在两台机器之间复制/粘贴,它是否有任何临时服务器或虚拟机来执行此任务?我认为不是,因为它是免费的,这就是为什么我学习了套接字、TCP/IP 方法但我找不到解决方案:(
  • 我对“Teamviewer”一无所知(不管是什么)。大多数 NAT 路由器可以通过“通用即插即用”以编程方式进行配置。但我相信,目前这只会让你的事情变得复杂。您应该熟悉端口转发的概念以及如何首先手动配置至少一个路由器。
  • 感谢您的回答!我将进一步探讨这个问题。
【解决方案2】:

您可能必须在您的两个路由器中为您的程序用于通信的端口设置一些Port Forwarding 以使其在 WAN 上工作。在 LAN 中这更容易,因为它通常默认对所有端口开放。

如何设置端口转发取决于您的路由器,但可以在http://portforward.com找到一些信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多