这个是网上的代码,如下:
目前有2个问题:
1、mappings 这个值经常为 null,我windows 7 防火墙已经关闭,路由器upnp也开启了。
但有时莫名其妙mappings 不为null,于是就把映射信息添加到路由器了。如图
2、当添加端口映射成功后,始终无法通信,如图:
哪位高手指点一下,谢谢!!!!!!
相关代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions; //提取IP时的正则
using System.Threading.Tasks; //Task
using System.IO; //读取服务器信息用到StreamReader
using NATUPNPLib; //Windows UPnP COM组件
namespace mgen_upnp
{
class Program
{
static void Main(string[] args)
{
//获取Host Name
var name = Dns.GetHostName();
Console.WriteLine("用户:" + name);
//从当前Host Name解析IP地址,筛选IPv4地址是本机的内网IP地址。
var ipv4 = Dns.GetHostEntry(name).AddressList.Where(i => i.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();
Console.WriteLine("内网IP:" + ipv4);
Console.WriteLine("设置UPnP");
//UPnP绑定信息
var eport = 8733;
var iport = 8733;
var description = "NAT测试";
//创建COM类型
var upnpnat = new UPnPNAT();
var mappings = upnpnat.StaticPortMappingCollection;
//错误判断
if (mappings == null)
{
Console.WriteLine("没有检测到路由器,或者路由器不支持UPnP功能。");
return;
}
//添加之前的ipv4变量(内网IP),内部端口,和外部端口
mappings.Add(eport, "TCP", iport, ipv4.ToString(), true, description);
Console.WriteLine("外部端口:{0}", eport);
Console.WriteLine("内部端口:{0}", iport);
//外网IP变量
string eip;
//正则
var regex = @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b";
using (var webclient = new WebClient())
{
var rawRes = webclient.DownloadString("http://checkip.dyndns.org/");
eip = Regex.Match(rawRes, regex).Value;
}
Console.WriteLine("外网IP:" + eip);
//在NAT下的服务器
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定内网IP和内部端口
socket.Bind(new IPEndPoint(ipv4, iport));
socket.Listen(1);
//在另一个线程中运行客户端Socket
Task.Factory.StartNew(() =>
{
//TaskDelay (1000).Wait();
ClientSocket(eip, eport);
});
//成功连接
var client = socket.Accept();
//服务器向客户端发送信息
client.Send(Encoding.Unicode.GetBytes("=== 欢迎来到Ace的服务器!===" + Environment.NewLine));
Console.ReadKey(false);
}
//ip参数和port参数是公网的IP地址,和UPnP中的外部端口
static void ClientSocket(string ip, int port)
{
try
{
Console.WriteLine("建立客户端TCP连接");
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
using (var ns = new NetworkStream(socket))
using (var sr = new StreamReader(ns, Encoding.Unicode))
{
Console.WriteLine("收到来自服务器的回应:");
Console.WriteLine(sr.ReadLine());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
12 个解决方案
#1
还有就是 var mappings = upnpnat.StaticPortMappingCollection;
这里mappings 经常性的得到空值,不知道为什么?崩溃了
这里mappings 经常性的得到空值,不知道为什么?崩溃了
#2
自己顶。。。。。
还有个问题,就是当局域网a内的某电脑发往局域网b中的服务器发送数据成功,b怎么样才能回复消息呢?我测试发现a的发送ip是外网ip,但端口是随机的,我在a局域网的电脑里如下代码:
无法接收到回复的消息。。。
还有个问题,就是当局域网a内的某电脑发往局域网b中的服务器发送数据成功,b怎么样才能回复消息呢?我测试发现a的发送ip是外网ip,但端口是随机的,我在a局域网的电脑里如下代码:
void ReceiveConn()
{
lock (SendMsg)
{
{
if (ConnServer == null)
{
ConnServer = new UdpClient();
}
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] data = ConnServer.Receive(ref iep);
string msg = Encoding.UTF8.GetString(data);
ShowLabel(msg, label1, Color.Green);
}
}
}
}
无法接收到回复的消息。。。
#3
我也有一样的问题,下面的mappings经常返回null,了解的请解答啊
var mappings = upnpnat.StaticPortMappingCollection;
var mappings = upnpnat.StaticPortMappingCollection;
#4
这个帖子有人回答么?
#5
本人非楼主,但是遇到一样的问题,找耳挠腮没有用,高手赐教啊
#6
#7
using NATUPNPLib; //Windows UPnP COM组件 缺少?????
#8
防火墙开了么,打开这个端口,或者允许这个程序通过。
#9
这个我肯定引用了,不然都无法debug
#10
我在本地电脑上测试的,都是关闭防火墙和杀毒软件的
#11
你好楼主,我也遇到为空的问题,用的TP_Link 的小无线路由,有upnp功能,楼主解决了吗?
#12
是不是测试的机器在路由器的lan口上(内网)?
#1
还有就是 var mappings = upnpnat.StaticPortMappingCollection;
这里mappings 经常性的得到空值,不知道为什么?崩溃了
这里mappings 经常性的得到空值,不知道为什么?崩溃了
#2
自己顶。。。。。
还有个问题,就是当局域网a内的某电脑发往局域网b中的服务器发送数据成功,b怎么样才能回复消息呢?我测试发现a的发送ip是外网ip,但端口是随机的,我在a局域网的电脑里如下代码:
无法接收到回复的消息。。。
还有个问题,就是当局域网a内的某电脑发往局域网b中的服务器发送数据成功,b怎么样才能回复消息呢?我测试发现a的发送ip是外网ip,但端口是随机的,我在a局域网的电脑里如下代码:
void ReceiveConn()
{
lock (SendMsg)
{
{
if (ConnServer == null)
{
ConnServer = new UdpClient();
}
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] data = ConnServer.Receive(ref iep);
string msg = Encoding.UTF8.GetString(data);
ShowLabel(msg, label1, Color.Green);
}
}
}
}
无法接收到回复的消息。。。
#3
我也有一样的问题,下面的mappings经常返回null,了解的请解答啊
var mappings = upnpnat.StaticPortMappingCollection;
var mappings = upnpnat.StaticPortMappingCollection;
#4
这个帖子有人回答么?
#5
本人非楼主,但是遇到一样的问题,找耳挠腮没有用,高手赐教啊
#6
#7
using NATUPNPLib; //Windows UPnP COM组件 缺少?????
#8
防火墙开了么,打开这个端口,或者允许这个程序通过。
#9
这个我肯定引用了,不然都无法debug
#10
我在本地电脑上测试的,都是关闭防火墙和杀毒软件的
#11
你好楼主,我也遇到为空的问题,用的TP_Link 的小无线路由,有upnp功能,楼主解决了吗?
#12
是不是测试的机器在路由器的lan口上(内网)?