参考了网上的一篇文章,由于时间长了,具体地址不知道了。

引入了一个DLL: Interop.NATUPNPLib.dll,实现穿透局域网,进行Socket通信。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using NATUPNPLib;
  8. using System.Threading;
  9. using System.Text.RegularExpressions;
  10. using System.IO;
  11.  
  12. namespace _22UPnP穿透内网
  13. {
  14. class Program
  15. {
  16. static void Main(string[] args)
  17. {
  18. //获取Host Name
  19. string serverName = Dns.GetHostName();
  20. Console.WriteLine("Server名称:" + serverName);
  21. //从当前Host Name解析IP地址,筛选IPv4地址是本机的内网IP地址。
  22. IPAddress internalIP = Dns.GetHostEntry(serverName).AddressList
  23. .Where(i => i.AddressFamily == AddressFamily.InterNetwork)
  24. .FirstOrDefault();
  25. Console.WriteLine("Server内网IP:" + internalIP);
  26.  
  27. UPnPNAT upnp = new UPnPNAT();
  28. IStaticPortMappingCollection staticPortMappingCollection = upnp.StaticPortMappingCollection;
  29. if (staticPortMappingCollection == null)
  30. {
  31. Console.WriteLine("没有检测到路由器,或者路由器不支持UPnP功能。");
  32. return;
  33. }
  34.  
  35. int internalPort = 3898;//Server的端口号
  36. int externalPort = 4343;//对应映射的外部端口号
  37.  
  38. staticPortMappingCollection.Add(
  39. externalPort,//外网端口
  40. "TCP",//协议类型
  41. internalPort,//内网端口
  42. internalIP.ToString(),//内网IP地址
  43. true,//是否开启
  44. "UPNP_Test"//描述
  45. );
  46.  
  47. Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  48. EndPoint serverEndPoint = new IPEndPoint(internalIP, internalPort);
  49. serverSocket.Bind(serverEndPoint);
  50. serverSocket.Listen(1);
  51. Console.WriteLine("开启服务端监听......\n");
  52.  
  53. Thread serverThread = new Thread(() => {
  54. Socket socket = null;
  55. while (true)
  56. {
  57. if (socket!= null || (socket = serverSocket.Accept()) != null)
  58. {
  59. byte[] byteRec = new byte[1024*1024];//设置消息接收缓存区
  60. int msgLen = socket.Receive(byteRec);
  61. string msgRec = Encoding.UTF8.GetString(byteRec,0,msgLen);
  62. Console.WriteLine("来自Client的消息:\n{0}", msgRec);
  63. }
  64. }
  65. });
  66. serverThread.IsBackground = true;
  67. serverThread.Start();
  68.  
  69. //外网IP变量
  70. string externalIP;
  71. //正则
  72. var regex = @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b";
  73. Console.WriteLine("开始获取外网IP......");
  74. using (var webclient = new WebClient())
  75. {
  76. var rawRes = webclient.DownloadString("http://checkip.dyndns.org/");
  77. externalIP = Regex.Match(rawRes, regex).Value;
  78. }
  79.  
  80. Console.WriteLine("获取外网IP成功:" + externalIP);
  81.  
  82. Thread clientThread = new Thread(() =>
  83. {
  84. ClientConnectToServer(IPAddress.Parse(externalIP), externalPort);
  85. });
  86. clientThread.Start();
  87.  
  88. Console.ReadKey();
  89. }
  90.  
  91. static void ClientConnectToServer(IPAddress remoteIP, int remotePort)
  92. {
  93. Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  94. clientSocket.Connect(new IPEndPoint(remoteIP, remotePort));
  95. IPEndPoint remoteEndPoint = clientSocket.RemoteEndPoint as IPEndPoint;
  96. for (int i = 0; i < 3; i++)
  97. {
  98. string msgFromClient = string.Format("Hello, this msg is from Client. \n{2}\n[Remote IP: {0}, Remote Port: {1} ]\n",
  99. remoteEndPoint.Address, remoteEndPoint.Port, DateTime.Now
  100. );
  101. byte[] bytes = Encoding.UTF8.GetBytes(msgFromClient);
  102. //客户端向服务端发送消息
  103. clientSocket.Send(bytes);
  104. Thread.Sleep(1000);
  105. }
  106. }
  107. }
  108. }

附:源码下载地址: http://download.csdn.net/detail/frombegintoend/5688855

附有Interop.NATUPNPLib.dll

C#用UPnP穿透内网的更多相关文章

  1. n2n网络穿透内网

    目录 前言 配置 网络拓扑: 公网服务器的配置 公司电脑的配置 家里笔记本的配置 注意事项 使用n2n网络 n2n的各edge之间传输数据 补充:NAT类型 后记 前言 在家里的时候比较经常需要对公司 ...

  2. 穿透内网,连接动态ip,内网ip打洞-----p2p实现原理(转)

    源: 穿透内网,连接动态ip,内网ip打洞-----p2p实现原理

  3. 1.使用frp穿透内网

    1.前因后果 1.1弃用ngrok 为节约服务器成本,花了500多块买了一个华为云得1G 1核心 5M得云服务器.然后用ngrok来穿透内网.一直用得还  但是今天在弄nginx得时候发现 ngrok ...

  4. centos7下使用n grok编译服务端和客户端穿透内网

    (发现博客园会屏蔽一些标题中的关键词,比如ngrok.内网穿透,原因不知,所以改了标题才能正常访问,) 有时候想在自己电脑.路由器或者树莓派上搭建一些web.vpn等服务让自己用,但是自己的电脑一般没 ...

  5. frp端口映射穿透内网

    前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...

  6. FtpServer穿透内网访问配置踩笔记

    FtpServer穿透内网访问配置踩笔记 引言 FtpServer是服务器文件远程管理常用方式. 以前在局域网配置Ftp服务器以及使用公网上的Ftp服务均未碰到问题,固未对Ftp传输进行深入了解. 然 ...

  7. frp穿透内网使用vsftpd服务

    本篇文章将会介绍如何使用frp穿透内网以及如何在centos8环境下安装和使用vsftpd,最后在公网通过frp穿透内网使用ftp. 一.内网穿透神器frp frp 是一个专注于内网穿透的高性能的反向 ...

  8. QQ通信原理及QQ是怎么穿透内网进行通信的? (转)

    原:http://f543711700.iteye.com/blog/978044#bc2344608 QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~ ...

  9. [转载]QQ通讯原理及QQ是怎么穿透内网的

    QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登 ...

随机推荐

  1. [原创]CI持续集成系统环境---部署Gitlab环境完整记录

    Gitlab是一个代码托管平台,在实际工作中,对代码管理十分有用. 废话不多说,下面是对我自己搭建的Gitlab环境做一记录: (1)安装 ------------------------------ ...

  2. html5压缩图片并上传

    手机端图片有很大的,上传的时候很慢,这时候就要压缩一下了,有一个开源的js可以压缩图片的大小,开源地址如下:https://github.com/think2011/localResizeIMG3 代 ...

  3. css3d

    立方体:http://sandbox.runjs.cn/show/1h6zvghj 原理分析:(左负右正) x:与屏幕水平:(在屏幕上) y:与屏幕水平方向垂直(在屏幕上) z:垂直于屏幕(在屏幕外) ...

  4. android gravity属性 和 weight属性

    来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

  5. C语言 百炼成钢7

    //题目19:一个数如果恰好等于它的因子之和,这个数就称为“完数”.例如6=1+2+3.编程找出1000以内的所有完数. #define _CRT_SECURE_NO_WARNINGS #includ ...

  6. CentOS 7 安装桌面环境

    首先进入要使用root权限: 使用 yum grouplist可以看现在的安装情况以及支持哪些软件包. 使用 yum groupinstall "GNOME Desktop" &q ...

  7. 在WebApi中实现Cors访问

    Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...

  8. 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然

    北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础                                           班级:1352           ...

  9. 启动页面设置,icon图标设置

    更多尺寸像素如何放置请看:http://chicun.jammy.cc/ 如何设置App的启动图,也就是Launch Image? 新建一个iosLaunchImage文件夹

  10. ASP.NET MVC 5 入门教程 (2) 控制器Controller

    文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC ...