当前位置:编程学习 > C#/ASP.NET >>

c#利用upnp做端口映射成功了,但始终没法连接,哪位高手帮看下代码?

c#利用upnp做端口映射成功了,但始终没法连接,哪位高手帮看下代码?
这个是网上的代码,如下:
目前有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);
            }
        }
    }
}

--------------------编程问答-------------------- 还有就是 var mappings = upnpnat.StaticPortMappingCollection;
这里mappings 经常性的得到空值,不知道为什么?崩溃了 --------------------编程问答-------------------- 自己顶。。。。。
还有个问题,就是当局域网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);
                    }
                }
            }
        }


无法接收到回复的消息。。。 --------------------编程问答-------------------- 我也有一样的问题,下面的mappings经常返回null,了解的请解答啊

var mappings = upnpnat.StaticPortMappingCollection; --------------------编程问答-------------------- 这个帖子有人回答么? --------------------编程问答-------------------- 本人非楼主,但是遇到一样的问题,找耳挠腮没有用,高手赐教啊
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,