通过 UPnP 轻松进行端口转发和路由器管理
本文介绍了端口转发的概念。同时提供了 UPnP 源代码。
引言
本文将向您介绍端口转发的概念以及如何使用 UPnP 技术将端口转发条目添加到您的路由器中。
什么是端口转发
端口转发或端口触发允许远程计算机(例如,互联网上的公共机器)连接到私有局域网内的特定计算机。
基本上,端口转发的工作原理是您可以将路由器设置为允许互联网用户访问位于路由器后面的计算机。您的路由器具有公共 IP,而您的计算机只有私有 IP。互联网用户可以直接访问您的路由器,但不能直接访问您的计算机。因此,如果您正在使用 utorrent 或其他 P2P 软件,并且希望获得更高的下载速度,您必须允许互联网用户直接访问您的计算机。然后,您必须设置您的路由器并添加端口映射。通常,您必须登录到路由器的管理页面并手动添加端口映射。如果您使用 azureus、utorrent 或 BitComet 从互联网下载电影或文件,并希望获得非常高的下载速度,您必须知道如何操作路由器以添加或删除端口映射。
手动端口转发与自动端口转发
任何人都可以配置路由器的端口转发,但这是一个通常不简单的手动过程,并且该过程因不同的路由器型号而异。有一些网站汇总了配置大多数常见路由器的说明——其中最好的可能是 www.PortForward.com。请查看该网站,您会看到配置路由器以端口转发传入连接的各种说明。UPnP 技术使配置路由器进行端口转发和 NAT 穿越变得更容易,因为配置可以以编程方式为您完成,而无需您手动操作。
什么是 UPnP?
通用即插即用 (UPnP) 是 UPnP 论坛发布的一组计算机网络协议。UPnP 的目标是允许设备无缝连接,并简化家庭(数据共享、通信和娱乐)和企业环境中的网络实施。UPnP 通过定义和发布基于开放的、基于互联网的通信标准的 UPnP 设备控制协议来实现这一目标。如果您想购买路由器,您应该检查规格:如果您没有看到支持 UPnP,那就扔掉它吧:)
如何实现 UPnP 引擎?
实际上,UPnP 只是一个 SOAP 消息。您可以查看附件,找到源代码以了解如何将端口转发条目添加到路由器中。
#ifndef UPNPNAT_H
#define UPNPNAT_H
#include <string>
#include <vector>
#pragma warning(disable: 4251)
#define DefaultTimeOut 10
#define DefaultInterval 200
class __declspec (dllexport) UPNPNAT
{
public:
bool init(int time_out=DefaultTimeOut,int interval=DefaultInterval); //init
bool discovery();//find router
/****
**** _description: port mapping name
**** _destination_ip: internal ip address
**** _port_ex:external: external listen port
**** _destination_port: internal port
**** _protocal: TCP or UDP
***/
bool add_port_mapping(
char * _description, char * _destination_ip, unsigned short int _port_ex,
unsigned short int _destination_port, char * _protocal);//add port mapping
const char * get_last_error(){ return last_error.c_str();}//get last error
private:
bool get_description(); //
bool parser_description(); //
bool tcp_connect(const char * _addr,unsigned short int _port);
bool parse_mapping_info();
int udp_socket_fd;
int tcp_socket_fd;
typedef enum
{
NAT_INIT=0,
NAT_FOUND,
NAT_TCP_CONNECTED,
NAT_GETDESCRIPTION,
NAT_GETCONTROL,
NAT_ADD,
NAT_DEL,
NAT_GET,
NAT_ERROR
} NAT_STAT;
NAT_STAT status;
int time_out;
int interval;
std::string service_type;
std::string describe_url;
std::string control_url;
std::string base_url;
std::string service_describe_url;
std::string description_info;
std::string last_error;
std::string mapping_info;
};
#endif
这是演示源代码,用于学习如何使用 Upnp 引擎
#include "upnpnat.h"
int main (int argc,char * argv[]){
UPNPNAT nat;
nat.init(5,10);
if(!nat.discovery()){
printf("discovery error is %s\n",nat.get_last_error());
return -1;
}
if(!nat.add_port_mapping("test","192.168.12.117",1234,1234,"TCP")){
printf("add_port_mapping error is %s\n",nat.get_last_error());
return -1;
}
printf("add port mapping succ.\n");
return 0;
}