資源簡介
VC++端口轉發程序源碼

代碼片段和文件信息
//?MPortServer.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdafx.h“
#include?
#include?
#pragma?comment(lib?“ws2_32.lib“)
#define?MAXCONN?100
int?g_nAcceptCount?=?0;
typedef?struct?_SOCKINFO
{
int?MapPort;
char?MapIp[50];
SOCKET?LisSocket;
}SOCKINFO*PSOCKINFO;
typedef?struct?_SOCKS
{
SOCKET?MapSocket;
SOCKET?LisSocket;
}SOCKS*PSOCKS;
bool?InitSocket()
{
WSADATA?wsaData;
if?(WSAStartup(MAKEWORD(22)?&wsaData))
{
printf(“ERROR:WSAStartup?Error.\r\n“);
return?false;
}
return?true;
}
bool?SendData(SOCKET?s?char?*data?int?len)
{
char?*?p?=?data;
int?i?=?0;
int?k?=?len;
int?ret?=?0;
if(len?<=?0)?return?TRUE;
while(1)
{
ret?=?send(spk0);
if(ret?==?0?||?ret?==?SOCKET_ERROR)
{
return?FALSE;
}
i?+=?ret;
p?+=?ret;
k?-=?ret;
if(i?>=?len)?break;
}
return?TRUE;
}
DWORD?WINAPI?TranslateData(LPVOID?pvParam)
{
SOCKS?*LisAndMapSocket?=?(SOCKS*)pvParam;
FD_SET?fdread;
FD_ZERO(&fdread);
FD_SET(LisAndMapSocket->LisSocket?&fdread);
FD_SET(LisAndMapSocket->MapSocket?&fdread);
char?buff[8192];
int?nRecvnSend;
while(select(0?&fdread?NULL?NULL?NULL)?!=?SOCKET_ERROR)
{
ZeroMemory(buff?sizeof(buff));
if?(FD_ISSET(LisAndMapSocket->LisSocket?&fdread))
{
nRecv?=?recv(LisAndMapSocket->LisSocket?buff?sizeof(buff)?0);
nSend?=?SendData(LisAndMapSocket->MapSocket?buff?nRecv);
if?(nRecv?==?SOCKET_ERROR?||?nSend?==?false)
{
printf(“ERROR:Translate?listen?socket?data?error.\r\n“);
break;
}
}?
else?if?(FD_ISSET(LisAndMapSocket->MapSocket?&fdread))
{
nRecv?=?recv(LisAndMapSocket->MapSocket?buff?sizeof(buff)?0);
nSend?=?SendData(LisAndMapSocket->LisSocket?buff?nRecv);
if?(nRecv?==?SOCKET_ERROR?||?nSend?==?false)
{
printf(“ERROR:Translate?map?socket?data?error.\r\n“);
break;
}
}
FD_ZERO(&fdread);
FD_SET(LisAndMapSocket->LisSocket?&fdread);
FD_SET(LisAndMapSocket->MapSocket?&fdread);
}
closesocket(LisAndMapSocket->MapSocket);
closesocket(LisAndMapSocket->LisSocket);
g_nAcceptCount--;
return?0;
}
DWORD?LisAccept(SOCKINFO?si)
{
DWORD?dwResult?=?0;
SOCKS?LisAndMapSocket; //連接成功socket和監聽socket
SOCKINFO?sockinfo?=?si;
sockaddr_in?sinmap;
sinmap.sin_family?=?AF_INET;
sinmap.sin_port?=?htons(sockinfo.MapPort);
sinmap.sin_addr.S_un.S_addr?=?inet_addr(sockinfo.MapIp);
//如果監聽socket沒有關閉,則一直accept
while(sockinfo.LisSocket?!=?INVALID_SOCKET)
{
SOCKET?mapSocket?=?socket(AF_INET?SOCK_STREAM?IPPROTO_TCP);
SOCKET?sAccept?=?accept(sockinfo.LisSocket?NULL?NULL);
if?(sAccept?==?INVALID_SOCKET)
break;
LisAndMapSocket.LisSocket?=?sAccept;
//如果客戶端連接沒有斷開則一直嘗試連接要映射的端口
do?
{
if?(connect(mapSocket?(SOCKADDR*)&sinmap?sizeof(sinmap))?==?SOCKET_ERROR)
{
printf(“ERROR:Connect?map?computer?error.\r\n“);
if?(sAccept?!=?INVALID_SOCKET)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4596??2009-02-18?07:33??MPortServer.dsp
?????文件????????530??2009-02-18?07:33??MPortServer.dsw
?????文件????????256??2009-02-18?18:30??MPortServer.plg
?????文件???????4211??2009-02-18?18:30??MPortServer.cpp
?????文件??????50176??2009-02-18?18:30??MPortServer.ncb
?????文件??????53760??2009-02-18?18:30??MPortServer.opt
?????文件???????1238??2009-02-18?07:33??ReadMe.txt
?????文件????????298??2009-02-18?07:33??StdAfx.cpp
?????文件????????667??2009-02-18?07:33??StdAfx.h
-----------?---------??----------?-----??----
???????????????115732????????????????????9
- 上一篇:超級瑪麗c語言源代碼
- 下一篇:計算機圖形學——球的光照模型算法
評論
共有 條評論