资源简介
c++实现的高效率端口映射程序,对于学习winsock编程很有帮助,用vc6.0构建的工程,直接导入即可
代码片段和文件信息
/*
PortTransfer_三种模式。
(1) PortTransfer Port Dest_IP Port
在运行本程序的计算机上监听Port端口,并将所有连接请求转到Dest_IP的Port去
(2) PortTransfer ctrlIP ctrlPort Dest_IP Port
和模式3配合用,程序将先主动连接ctrlIP:ctrlPort之后所有在模式3的ServerPort端口的请求转到Dest_IP:Port去
(3) PortTransfer ctrlPort ServerPort
在执行模式2前先执行,将监听ctrlPort和ServerPort 端口ctrlPort供模式2使用,ServerPort提供服务.
模式1适合在网关上运行,将内网IP的端口映射到网关上,
如:PortTransfer 88 192.168.0.110 80
那么网关将开启88端口,所有在88端口的请求将转到内网的192.168.0.110的80端口
模式2和模式3联合使用可以将内网的IP和端口映射到指定的IP和端口上,
一般在公网IP(假设61.1.1.1)上执行模式3,如:PortTransfer 99 80 80是映射过来的端口
内网用户执行模式2如:PortTransfer 61.1.1.1 99 127.0.0.1 80,
那么程序在内网将先连接61.1.1.1:99建立个连接,并等待接收命令。
之后当61.1.1.1的80端口有请求,将通过99端口命令内网机子和公网机子建立条新的数据连接,
并将请求通过新建的连接将请求转发到内网机.
*/
#include “stdafx.h“
#include
#include “stack.h“
//#include “stack.cpp“ //模板类编译时未实例化
#include “transferparam.h“
//#include “transferparam.cpp“
#include “portmapping.h“
#pragma comment(lib “ws2_32.lib“)
//int nTimes = 0;
int DataSend(SOCKET s char *DataBuf int DataLen)//将DataBuf中的DataLen个字节发到s去
{
int nBytesLeft = DataLen;
int nBytesSent = 0;
int ret;
//set socket to blocking mode
int iMode = 0;
ioctlsocket(s FIONBIO (u_long FAR*) &iMode);
while(nBytesLeft > 0)
{
ret = send(s DataBuf + nBytesSent nBytesLeft 0);
if(ret <= 0)
break;
nBytesSent += ret;
nBytesLeft -= ret;
}
return nBytesSent;
}
DWORD WINAPI TransmitData(LPVOID lParam)//在两个SOCKET中进行数据转发
{
SOCKINFO socks = *((SOCKINFO*)lParam);
SOCKET ClientSock = socks.ClientSock;
SOCKET ServerSock = socks.ServerSock;
char RecvBuf[MAXBUFSIZE] = {0};
fd_set Fd_Read;
int ret nRecv;
while(1)
{
FD_ZERO(&Fd_Read);
FD_SET(ClientSock &Fd_Read);
FD_SET(ServerSock &Fd_Read);
ret = select(0 &Fd_Read NULL NULL NULL);
if(ret <= 0)
goto error;
if(FD_ISSET(ClientSock &Fd_Read))
{
nRecv = recv(ClientSock RecvBuf sizeof(RecvBuf) 0);
if(nRecv <= 0)
goto error;
ret = DataSend(ServerSock RecvBuf nRecv);
if(ret == 0 || ret != nRecv)
goto error;
}
if(FD_ISSET(ServerSock &Fd_Read))
{
nRecv = recv(ServerSock RecvBuf sizeof(RecvBuf) 0);
if(nRecv <= 0)
goto error;
ret = DataSend(ClientSock RecvBuf nRecv);
if(ret == 0 || ret != nRecv)
goto error;
}
}
error:
closesocket(ClientSock);
closesocket(ServerSock);
return 0;
}
SOCKET ConnectHost(DWORD dwIP WORD wPort)//连接指定IP和端口
{
SOCKET sockid;
if ((sockid = socket(AF_INETSOCK_STREAM0)) == INVALID_SOCKET)
{
DumpSocketError(WSAGetLastError());
return 0;
}
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.S_un.S_addr = dwIP;
srv_addr.sin_port = htons(wPort);
if (connect(sockid(struct sockaddr*)&srv_addrsizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
DumpSocketError(WSAGetLastError());
goto error;
}
return sockid;
error:
closesocket(sockid);
return 0;
}
SOCKET ConnectHost(char *szIP W
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 19023 2012-12-13 18:20 portmapping\portmapping.cpp
文件 4922 2012-11-30 15:15 portmapping\portmapping.dsp
文件 545 2012-11-30 15:11 portmapping\portmapping.dsw
文件 1034 2012-12-10 14:28 portmapping\portmapping.h
文件 74752 2013-07-07 01:23 portmapping\portmapping.ncb
文件 55808 2013-07-07 01:23 portmapping\portmapping.opt
文件 1828 2013-07-06 11:37 portmapping\portmapping.plg
文件 1238 2012-11-30 15:11 portmapping\ReadMe.txt
文件 521 2012-12-10 00:39 portmapping\stack.cpp
文件 295 2012-12-13 00:02 portmapping\stack.h
文件 298 2012-11-30 15:11 portmapping\StdAfx.cpp
文件 769 2012-11-30 15:11 portmapping\StdAfx.h
文件 543 2012-12-10 00:38 portmapping\transferparam.cpp
文件 343 2012-12-14 17:27 portmapping\transferparam.h
目录 0 2013-07-26 07:25 portmapping\Debug
目录 0 2013-07-26 07:25 portmapping\Release
目录 0 2013-07-26 07:25 portmapping
----------- --------- ---------- ----- ----
161919 17
- 上一篇:QR分解算法的纯c++代码
- 下一篇:C语言课程设计 - 学生宿舍管理系统
评论
共有 条评论