📄 portmapping.cpp
字号:
/*************************************************************************** * Copyright (C) 2006 by taofei * * gudu2005@126.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/#include "upnpnat.h"#include "utils.h"#include <iostream>// 命令行参数 -s|-S 查看路由器上所有的映射// -a|-A protocal port [protocal port] ......... 增加映射// -d|-D protocal port [protocal port] .........删除映射// -h|-H 帮助//int main ()//{// UPNPNAT nat;// nat.init(10,10);// if(!nat.discovery())// {// std::cerr<<nat.get_last_error()<<std::endl;// system("pause");// return -1;// }// system("pause"); // // //}int main (int argc,char * argv[]){ if(argc<=1||strcmp(argv[1],"-h")==0|strcmp(argv[1],"-H")==0) //show help { std::cout<<"本工具实现在支持UPNP的路由器上增加 删除 查看端口映射"<<std::endl; std::cout<<"用法:-a|-A protocal port [protocal port] [protocal port]... 增加端口映射 "<<std::endl; std::cout<<" -d|-D protocal port [protocal port] [protocal port]... 删除端口映射 "<<std::endl; std::cout<<" -s|-S 查看路由器上所有的映射"<<std::endl; std::cout<<"Examples: portmapping -A TCP 10000 UDP 10003 增加TCP/10000 UDP/10003 两个端口映射"<<std::endl; std::cout<<" portmapping -D TCP 10000 UDP 10003 删除TCP/10000 UDP/10003 两个端口映射"<<std::endl; std::cout<<" portmapping -S 查看路由器上所有的映射 "<<std::endl; return 0; } UPNPNAT nat; nat.init(10,10); //寻找upnp设备 if(!nat.discovery()) { std::cerr<<nat.get_last_error()<<std::endl; return -1; } //获得upnp设备描述文件 if(!nat.get_description()) { std::cerr<<nat.get_last_error()<<std::endl; return -1; } //解析upnp设备描述文件 if(!nat.parser_description()) { std::cerr<<nat.get_last_error()<<std::endl; return -1; } int i; unsigned int port; if(strcmp(argv[1],"-a")==0||strcmp(argv[1],"-A")==0) //add port mapping { i=2; for(;i+1<argc;i=i+2) { if(strcmp(argv[i],"UDP")==0||strcmp(argv[i],"udp")==0) { if((port=atoi(argv[i+1]))!=0&&port<65536) { if(nat.add_port_mapping(port,"UDP")) { std::cout<<"成功添加端口映射 UDP/"<<port<<std::endl; continue; } else { std::cerr<<"添加端口映射 UDP/"<<port<<"时发生错误.详细信息如下:"<<std::endl; std::cerr<<nat.get_last_error()<<std::endl; return -1; } } else { std::cerr<<"参数错误:"<<argv[i+1]<<"似乎不是一个合法的端口号."<<std::endl; return -1; } } if(strcmp(argv[i],"TCP")==0||strcmp(argv[i],"tcp")==0) { if((port=atoi(argv[i+1]))!=0&&port<65536) { if(nat.add_port_mapping(port,"TCP")) { std::cout<<"成功添加端口映射 TCP/"<<port<<std::endl; continue; } else { std::cerr<<"添加端口映射 TCP/"<<port<<"时发生错误.详细信息如下:"<<std::endl; std::cerr<<nat.get_last_error()<<std::endl; return -1; } } else { std::cerr<<"参数错误:"<<argv[i+1]<<"似乎不是一个合法的端口号."<<std::endl; return -1; } } std::cerr<<"参数错误:"<<argv[i]<<"似乎不是合法的协议类型。(请使用TCP或UDP)"<<std::endl; return -1; } if(i<argc) //参数个数不匹配 { std::cerr<<"参数错误:缺少端口号."<<std::endl; return -1; } return 0; } if(strcmp(argv[1],"-d")==0||strcmp(argv[1],"-D")==0) //del port mapping { i=2; for(;i+1<argc;i=i+2) { if(strcmp(argv[i],"UDP")==0||strcmp(argv[i],"udp")==0) { if((port=atoi(argv[i+1]))!=0) { if(nat.del_port_mapping(port,"UDP")) { std::cout<<"成功删除端口映射 UDP/"<<port<<std::endl; continue; } else { std::cerr<<"删除端口映射 UDP/"<<port<<"时发生错误.详细信息如下:"<<std::endl; std::cerr<<nat.get_last_error()<<std::endl; return -1; } } else { std::cerr<<"参数错误:"<<argv[i+1]<<"似乎不是一个合法的端口号."<<std::endl; return -1; } } if(strcmp(argv[i],"TCP")==0||strcmp(argv[i],"tcp")==0) { if((port=atoi(argv[i+1]))!=0) { if(nat.del_port_mapping(port,"TCP")) { std::cout<<"成功删除端口映射 TCP/"<<port<<std::endl; continue; } else { std::cerr<<"删除端口映射 TCP/"<<port<<"时发生错误.详细信息如下:"<<std::endl; std::cerr<<nat.get_last_error()<<std::endl; return -1; } } else { std::cerr<<"参数错误:"<<argv[i+1]<<"似乎不是一个合法的端口号."<<std::endl; return -1; } } std::cerr<<"参数错误:"<<argv[i]<<"似乎不是合法的协议类型。(请使用TCP或UDP)"<<std::endl; return -1; } if(i<argc) //参数个数不匹配 { std::cerr<<"参数错误:缺少端口号."<<std::endl; return -1; } return 0; } if(strcmp(argv[1],"-s")==0||strcmp(argv[1],"-S")==0) //get port mapping infomations { if(!nat.get_port_mapping()) { std::cerr<<"获得端口映射信息时发生错误.详细信息如下:\n"; std::cerr<<nat.get_last_error()<<std::endl; return -1; } return 0; } std::cerr<<"参数错误:\""<<argv[1]<<"\"非法."<<std::endl; return -1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -