資源簡介
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語言課程設計 - 學生宿舍管理系統
評論
共有 條評論