c# 怎么实现TCP外网访问内网!

解决方案 »

  1.   

     用UDP吧。。TCP瞒有难度的。。
      

  2.   

    见得例子都是内网发起连接的:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Net;
    using System.Threading;namespace mytcpchat
    {
        public partial class Form1 : Form
        {
            Socket c;
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
              
            }
             public void Client(IPEndPoint ServerIPEP)
            {
                try
                {
                    c = new Socket(ServerIPEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    c.Connect((EndPoint)ServerIPEP);
                    c.Send(System.Text.Encoding.Default.GetBytes("这是一个测试消息"));
                    byte[] data = new byte[2048];
                    int rect = c.Receive(data);
                    byte[] chat = new byte[rect];
                    Buffer.BlockCopy(data, 0, chat, 0, rect);
                    MessageBox.Show(System.Text.Encoding.Default.GetString(chat));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }        }        private void button1_Click(object sender, EventArgs e)
            {
                Client(new IPEndPoint(IPAddress.Parse("220.194.57.122"), 5566));
            }
        }
    }  服务端例子:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Net;
    using System.Threading;
    namespace mytcpserver
    {
        public partial class Form1 : Form
        {
            Socket s;
            IPEndPoint ServerIPEP;
            public Form1()
            {
                InitializeComponent();
            }
             public void  Server(int port)
            {
                ServerIPEP = new IPEndPoint(IPAddress.Any, port);
                s = new Socket(ServerIPEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                s.Bind((EndPoint)ServerIPEP);
                s.Listen(10);
                while (true)
                {
                    Socket uc = s.Accept();
                    byte[] data = new byte[2048] ;
                    int rect = uc.Receive(data);
                    byte[] chat = new byte[rect] ;
                    Buffer.BlockCopy(data, 0, chat, 0, rect);
                    MessageBox.Show("接收到来及客户端的消息"+uc.RemoteEndPoint.ToString()+System.Text.Encoding.Default.GetString(chat));
                    uc.Send(chat);
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {        }        private void button1_Click(object sender, EventArgs e)
            {
                Server(5566);
            }
        }
    }
      

  3.   

    最简单的方法就是在NAT上设置端口映射。
    也可以用类似UDP打洞的方式,但比UDP要复杂,需要将socket设置为允许复用,打洞过程都使用该socket。两端先分别连接公网上的服务器,通过服务器获得对方的IP和端口号,然后双方都向对方发起连接,之后其中一方改为监听,接受另一方的连接请求。此法不适用于对称NAT。