⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy32.cpp

📁 简单http代理程序
💻 CPP
字号:
// proxy32.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "proxy32.h"

#define HTTP "http://" 

#define PROXYPORT 8080 //Proxy 端口 
#define BUFSIZE 10240 //缓冲区大小 

#pragma comment(lib,"ws2_32.lib")

unsigned int ProxyThread(void *pParam); 
unsigned int SpyThread(void *pParam); 
extern BOOL g_bRunning;
SOCKET g_skListen; //用来侦听的SOCKET
//////////////////////////////////////////////////////////////// 


int StartServer() //启动服务 
{ 
    
	WSADATA wsaData; 
	sockaddr_in local; 

	if(::WSAStartup(0x202,&wsaData)!=0) 
	{
		WSACleanup(); 
		return 	-1;
	} 

	local.sin_family=AF_INET; 
	local.sin_addr.s_addr=INADDR_ANY; 
	local.sin_port=htons(PROXYPORT); 
	g_skListen=socket(AF_INET,SOCK_STREAM,0); 
	if(g_skListen==INVALID_SOCKET) 
	{
		WSACleanup(); 
		return -2;
	} 

	if(::bind(g_skListen,(sockaddr *)&local,sizeof(local))!=0) 
	{
	//	/////printf("\n Error in Binding socket.");
		WSACleanup(); 
		closesocket(g_skListen);
		return -3; 
	}

	if(::listen(g_skListen,5)!=0)
	{
	//	/////printf("\n Error in Listen.");
		WSACleanup(); 
		closesocket(g_skListen);
		return -4;
	} 

//	AfxBeginThread(ProxyThread,0); //启动侦听 
	CloseHandle(CreateThread(0,0,(LPTHREAD_START_ROUTINE)ProxyThread,0,0,0));
	return 1; 
} 

int CloseServer() //关闭服务 
{ 
	if(g_skListen != INVALID_SOCKET)
	{
		::shutdown(g_skListen,SD_SEND);
		closesocket(g_skListen);
	}
	WSACleanup(); 

	return 1; 

} 

//分析接收到的字符,得到远程主机地址 

int GetAddressAndPort( char * str, char *address, int * port) 
{ 
	char buf[BUFSIZE], command[512], proto[128], *p; 
	int i;
	int j; 
	sscanf(str,"%s%s%s",command,buf,proto); 
	p=strstr(buf,HTTP); 
	//HTTP 
	if(p) 
	{ 
		p+=strlen(HTTP);
		for(i=0;i< strlen(p);i++) 
			if( *(p+i)=='/') 
				break; 
		*(p+i)=0; 
		strcpy(address,p); 
		p=strstr(str,HTTP); 

		//去掉远程主机%C去掉远程主机名: GET http://www.njust.edu.cn/ HTTP1.1 == > GET / HTTP1.1
		for(j=0;j< i+strlen(HTTP);j++) 
			*(p+j)=' ';
		
		//如果不是默认的80端口,要做处理
		int iLocation=-1;
		for(i=0;i<strlen(address);i++)
		{
			if(address[i]==':')
			{

				iLocation=i;
				break;
			}
		}
		if(iLocation>0)
		{
			address[iLocation]=0;
			char *pch=&address[iLocation+1];
			*port=atoi(pch);
		}
		else
			*port=80; //缺省的 http 端口
	} 
	return 1; 
} 

// 取到本地的数据,发往远程主机
unsigned int ProxyThread(void *pParam)
{ 
	char Buffer[BUFSIZE];
	sockaddr_in saiTemp;
	int nTemp;
	char szAddress[256]; // 远程主机地址
	int nPort; // 用来联结远程主机的端口 
	SOCKET skClient; //socket : 本地机器到PROXY 服务机
	SOCKET skServer; //socket : PROXY 服务机到远程主机

	nTemp=sizeof(saiTemp);
	skClient=accept(g_skListen,(sockaddr*)&saiTemp,&nTemp); 
	CloseHandle(CreateThread(0,0,(LPTHREAD_START_ROUTINE)ProxyThread,pParam,0,0));    /// add via netwalker
	if( skClient == INVALID_SOCKET) 
	{ 
		/////printf( " Error in accept ");
		return -5;
	} 
	//读客户的第一行数据
	nTemp=recv(skClient,Buffer,sizeof(Buffer),0);
	if(nTemp == SOCKET_ERROR || nTemp ==0) 
	{
		goto CloseClientSocket;
	}
#ifdef _DEBUG
	Buffer[nTemp]=0;
	::OutputDebugString("\nFrom Client Request:\n");
	::OutputDebugString(Buffer);
#endif
	GetAddressAndPort(Buffer,szAddress,&nPort);

	unsigned int nAddress;
	hostent *pHostent;
	if (isalpha(szAddress[0]))
	{/* server address is a name */ 
		pHostent = gethostbyname(szAddress); 
	} 
	else
	{/* Convert nnn.nnn address to a usable one */
		nAddress = inet_addr(szAddress); 
		pHostent = gethostbyaddr((char *)&nAddress,4,AF_INET);
	} 
	if (pHostent == 0)
	{
		shutdown(skClient,SD_SEND);
		goto CloseClientSocket; 
	} // 
	// Copy the resolved information into the sockaddr_in structure // 
	memset(&saiTemp,0,sizeof(saiTemp));
	memcpy(&(saiTemp.sin_addr),pHostent->h_addr,pHostent->h_length);
	saiTemp.sin_family = pHostent->h_addrtype; 
	saiTemp.sin_port = htons(nPort); 
	skServer = socket(AF_INET,SOCK_STREAM,0); /* 打开一个 socket */ 
	if(skServer != INVALID_SOCKET && connect(skServer,(struct sockaddr*)&saiTemp,sizeof(saiTemp)) != SOCKET_ERROR)
	{
		nTemp=send(skServer,Buffer,nTemp,0);
		if(nTemp == SOCKET_ERROR)
		{
			::shutdown(skClient,SD_SEND);
		}
		while(nTemp != SOCKET_ERROR)
		{
			nTemp = recv(skServer,Buffer,sizeof (Buffer),0 );
			if (nTemp == SOCKET_ERROR  || nTemp == 0) 
			{ 
				::shutdown(skClient,SD_SEND);
				break;
			}
#ifdef _DEBUG
			Buffer[nTemp]=0;
			::OutputDebugString("\nFrom Server Data:\n");
			::OutputDebugString(Buffer);
#endif
			nTemp = send(skClient,Buffer,nTemp,0); 
			if (nTemp == SOCKET_ERROR)
			{ 
				::shutdown(skServer,SD_SEND);
				break;
			}
		}// end while
		closesocket(skServer);
	}
CloseClientSocket:
	closesocket(skClient);
	return 0; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -