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服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登 ...
随机推荐
- SQL2008安装后激活方式以及提示评估期已过解决方法(转)
第一步:进入SQL2008配置工具中的安装中心第二步:再进入维护界面,选择版本升级第三步:进入产品密钥,输入密钥第四步:一直点下一步,直到升级完毕.SQL Server 2008 Developer: ...
- 【转】【WPF】wpf 图片指针处理
我一直用GDI+做Winform 的基于指针的图片处理,这次下决心全部移到wpf上(主要是显示布局很方便)采用的图片是2512*3307 的大图 830万像素类库基于WritableBitmapEx ...
- 支持MVC的代码生成运行效果 C# ASP.NET
做技术的,你若还不懂MVC的话,你好像是外星球来的一样,或者还生活在远古社会里一样,这几天正好没什么事情干,可以静心学习学习MVC技术,顺便把原先的代码生成器修改了一下,只要数据库里设计好了数据结构, ...
- Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- C语言 百炼成钢6
//题目16:输入两个正整数m和n,求其最大公约数和最小公倍数. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include< ...
- php基础29:打开目录
<?php //1.打开一个目录 $dir = opendir("E:\AppServ\www\php"); //读取目录,使用一个循环来读出 while (!!$file= ...
- 待整理-coredump
Linux下如何产生coredump(gdb调试用) 任务发生异常,需要记录遗言信息,利用gdb调试,因此需要记录coredump文件.设置查看:在root用户下执行sysctl -a | grep ...
- liunx检查与安装软件包
检查软件包# rpm -qa | grep 例如:# rpm -qa | grep make检查make包 安装软件包 yum install 例如:yum install unixODBC安装un ...
- Android -- Properties使用
import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public ...
- 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤
编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...