C#用UPnP穿透内网
参考了网上的一篇文章,由于时间长了,具体地址不知道了。
引入了一个DLL: Interop.NATUPNPLib.dll,实现穿透局域网,进行Socket通信。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using NATUPNPLib;
- using System.Threading;
- using System.Text.RegularExpressions;
- using System.IO;
- namespace _22UPnP穿透内网
- {
- class Program
- {
- static void Main(string[] args)
- {
- //获取Host Name
- string serverName = Dns.GetHostName();
- Console.WriteLine("Server名称:" + serverName);
- //从当前Host Name解析IP地址,筛选IPv4地址是本机的内网IP地址。
- IPAddress internalIP = Dns.GetHostEntry(serverName).AddressList
- .Where(i => i.AddressFamily == AddressFamily.InterNetwork)
- .FirstOrDefault();
- Console.WriteLine("Server内网IP:" + internalIP);
- UPnPNAT upnp = new UPnPNAT();
- IStaticPortMappingCollection staticPortMappingCollection = upnp.StaticPortMappingCollection;
- if (staticPortMappingCollection == null)
- {
- Console.WriteLine("没有检测到路由器,或者路由器不支持UPnP功能。");
- return;
- }
- int internalPort = 3898;//Server的端口号
- int externalPort = 4343;//对应映射的外部端口号
- staticPortMappingCollection.Add(
- externalPort,//外网端口
- "TCP",//协议类型
- internalPort,//内网端口
- internalIP.ToString(),//内网IP地址
- true,//是否开启
- "UPNP_Test"//描述
- );
- Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- EndPoint serverEndPoint = new IPEndPoint(internalIP, internalPort);
- serverSocket.Bind(serverEndPoint);
- serverSocket.Listen(1);
- Console.WriteLine("开启服务端监听......\n");
- Thread serverThread = new Thread(() => {
- Socket socket = null;
- while (true)
- {
- if (socket!= null || (socket = serverSocket.Accept()) != null)
- {
- byte[] byteRec = new byte[1024*1024];//设置消息接收缓存区
- int msgLen = socket.Receive(byteRec);
- string msgRec = Encoding.UTF8.GetString(byteRec,0,msgLen);
- Console.WriteLine("来自Client的消息:\n{0}", msgRec);
- }
- }
- });
- serverThread.IsBackground = true;
- serverThread.Start();
- //外网IP变量
- string externalIP;
- //正则
- var regex = @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b";
- Console.WriteLine("开始获取外网IP......");
- using (var webclient = new WebClient())
- {
- var rawRes = webclient.DownloadString("http://checkip.dyndns.org/");
- externalIP = Regex.Match(rawRes, regex).Value;
- }
- Console.WriteLine("获取外网IP成功:" + externalIP);
- Thread clientThread = new Thread(() =>
- {
- ClientConnectToServer(IPAddress.Parse(externalIP), externalPort);
- });
- clientThread.Start();
- Console.ReadKey();
- }
- static void ClientConnectToServer(IPAddress remoteIP, int remotePort)
- {
- Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- clientSocket.Connect(new IPEndPoint(remoteIP, remotePort));
- IPEndPoint remoteEndPoint = clientSocket.RemoteEndPoint as IPEndPoint;
- for (int i = 0; i < 3; i++)
- {
- string msgFromClient = string.Format("Hello, this msg is from Client. \n{2}\n[Remote IP: {0}, Remote Port: {1} ]\n",
- remoteEndPoint.Address, remoteEndPoint.Port, DateTime.Now
- );
- byte[] bytes = Encoding.UTF8.GetBytes(msgFromClient);
- //客户端向服务端发送消息
- clientSocket.Send(bytes);
- Thread.Sleep(1000);
- }
- }
- }
- }
附:源码下载地址: http://download.csdn.net/detail/frombegintoend/5688855
附有Interop.NATUPNPLib.dll
C#用UPnP穿透内网的更多相关文章
- n2n网络穿透内网
目录 前言 配置 网络拓扑: 公网服务器的配置 公司电脑的配置 家里笔记本的配置 注意事项 使用n2n网络 n2n的各edge之间传输数据 补充:NAT类型 后记 前言 在家里的时候比较经常需要对公司 ...
- 穿透内网,连接动态ip,内网ip打洞-----p2p实现原理(转)
源: 穿透内网,连接动态ip,内网ip打洞-----p2p实现原理
- 1.使用frp穿透内网
1.前因后果 1.1弃用ngrok 为节约服务器成本,花了500多块买了一个华为云得1G 1核心 5M得云服务器.然后用ngrok来穿透内网.一直用得还 但是今天在弄nginx得时候发现 ngrok ...
- centos7下使用n grok编译服务端和客户端穿透内网
(发现博客园会屏蔽一些标题中的关键词,比如ngrok.内网穿透,原因不知,所以改了标题才能正常访问,) 有时候想在自己电脑.路由器或者树莓派上搭建一些web.vpn等服务让自己用,但是自己的电脑一般没 ...
- frp端口映射穿透内网
前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...
- FtpServer穿透内网访问配置踩笔记
FtpServer穿透内网访问配置踩笔记 引言 FtpServer是服务器文件远程管理常用方式. 以前在局域网配置Ftp服务器以及使用公网上的Ftp服务均未碰到问题,固未对Ftp传输进行深入了解. 然 ...
- frp穿透内网使用vsftpd服务
本篇文章将会介绍如何使用frp穿透内网以及如何在centos8环境下安装和使用vsftpd,最后在公网通过frp穿透内网使用ftp. 一.内网穿透神器frp frp 是一个专注于内网穿透的高性能的反向 ...
- QQ通信原理及QQ是怎么穿透内网进行通信的? (转)
原:http://f543711700.iteye.com/blog/978044#bc2344608 QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~ ...
- [转载]QQ通讯原理及QQ是怎么穿透内网的
QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登 ...
随机推荐
- [原创]CI持续集成系统环境---部署Gitlab环境完整记录
Gitlab是一个代码托管平台,在实际工作中,对代码管理十分有用. 废话不多说,下面是对我自己搭建的Gitlab环境做一记录: (1)安装 ------------------------------ ...
- html5压缩图片并上传
手机端图片有很大的,上传的时候很慢,这时候就要压缩一下了,有一个开源的js可以压缩图片的大小,开源地址如下:https://github.com/think2011/localResizeIMG3 代 ...
- css3d
立方体:http://sandbox.runjs.cn/show/1h6zvghj 原理分析:(左负右正) x:与屏幕水平:(在屏幕上) y:与屏幕水平方向垂直(在屏幕上) z:垂直于屏幕(在屏幕外) ...
- android gravity属性 和 weight属性
来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- C语言 百炼成钢7
//题目19:一个数如果恰好等于它的因子之和,这个数就称为“完数”.例如6=1+2+3.编程找出1000以内的所有完数. #define _CRT_SECURE_NO_WARNINGS #includ ...
- CentOS 7 安装桌面环境
首先进入要使用root权限: 使用 yum grouplist可以看现在的安装情况以及支持哪些软件包. 使用 yum groupinstall "GNOME Desktop" &q ...
- 在WebApi中实现Cors访问
Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...
- 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然
北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础 班级:1352 ...
- 启动页面设置,icon图标设置
更多尺寸像素如何放置请看:http://chicun.jammy.cc/ 如何设置App的启动图,也就是Launch Image? 新建一个iosLaunchImage文件夹
- ASP.NET MVC 5 入门教程 (2) 控制器Controller
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC ...