青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 298  文章 - 377  trackbacks - 0
<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(34)

隨筆分類

隨筆檔案

文章檔案

相冊

收藏夾

搜索

  •  

最新評論

閱讀排行榜

評論排行榜



 ?。?)一些基本變量

SOCKET HTTPSocket; // 主socket
struct sockaddr_in SocketAddr; // address socket
struct sockaddr_in BindSocket; // for bind


int m_nRecvTimeout; // recieve timeout
int m_nSendTimeout; // send timeout

WSADATA wsaData;

// 要下載文件部分。好像在BindSocket.sin_addr.s_addr = inet_addr (strHost);時,只能使用ip地址,所以了。。。

// 如果誰知道更好的方法,別忘了告訴我一下。

CString strHost="111.111.111.111 ";
CString DownLoadAddress="http://www.aitenshi.com/bbs/images/";
CString hostFile="logo.gif";
int HttpPort=80;



 ?。?)一些函數,用來取得http頭,和獲取文件大小

int GetFileLength(char *httpHeader)
{
CString strHeader;
int local;
strHeader=(CString)httpHeader;
local=strHeader.Find("Content-Length",0);
local+=16;
strHeader.Delete(0,local);
local=strHeader.Find("\r");
strHeader.SetAt(local,'\0');

char temp[30];
strcpy(temp,strHeader.GetBuffer(strHeader.GetLength()));
return atoi(temp);
}

int GetHttpHeader(SOCKET sckDest,char *str)
{
BOOL m_bResponsed=0;
int m_nResponseHeaderSize;

if(!m_bResponsed)
{
char c = 0;
int nIndex = 0;
BOOL bEndResponse = FALSE;
while(!bEndResponse && nIndex < 1024)
{
recv(sckDest,&c,1,0);
str[nIndex++] = c;
if(nIndex >= 4)
{
if(str[nIndex - 4] == '\r' && str[nIndex - 3] == '\n'
&& str[nIndex - 2] == '\r' && str[nIndex - 1] == '\n')
bEndResponse = TRUE;
}
}
m_nResponseHeaderSize = nIndex;
m_bResponsed = TRUE;
}

return m_nResponseHeaderSize;

}


 ?。?)用來發送的部分

void szcopy(char* dest,const char* src,int nMaxBytes)
{
int i_cntr=0;
while ((src[i_cntr]!='\0')    (i_cntr dest[i_cntr]=src[i_cntr++];
dest[i_cntr]='\0';
}

BOOL SocketSend(SOCKET sckDest,const char* szHttp)
{

char szSendHeader[MAXHEADERLENGTH];
int iLen=strlen(szHttp);
szcopy(szSendHeader,szHttp,iLen);
if(send (sckDest ,(const char FAR *)szSendHeader ,iLen ,0)==SOCKET_ERROR)
{
closesocket(sckDest);
AfxMessageBox("Error when send");
return FALSE;
}

return TRUE;
}

BOOL SocketSend(SOCKET sckDest,CString szHttp)
{

int iLen=szHttp.GetLength();
if(send (sckDest,szHttp,iLen,0)==SOCKET_ERROR)
{
closesocket(sckDest);
AfxMessageBox("Error when send");
return FALSE;
}

return TRUE;
}


 ?。?)用于連接的函數

  這里是做了一些連接用的操作,分了兩種情況

  1)如果沒有使用代理,則直接連到你指定的計算機

  2)如果使用了代理,則直接連到代理

BOOL CDLAngelDlg::ConnectHttp()
{

message="正在建立連接\n";


UpdateData(TRUE);
if(m_combo=="HTTP") // m_combo 一個下拉條
{
HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SocketAddr.sin_addr.s_addr = inet_addr (m_ProxyAddr);
SocketAddr.sin_family=AF_INET;
SocketAddr.sin_port=htons(atoi(m_Port));

struct fd_set fdSet;
struct timeval tmvTimeout={0L,0L};

FD_ZERO(&fdSet);
FD_SET(HTTPSocket, &fdSet);

if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when select.");
return 0;
}


if (connect(HTTPSocket, (const struct sockaddr *)&SocketAddr, sizeof(SocketAddr))==SOCKET_ERROR)
{
message="\n代理連接失敗\n";
m_message.CleanText();
m_message.AddText(message);
return 0;
}


// 發送CONNCET請求令到代理服務器,用于和代理建立連接

//代理服務器的地址和端口放在m_ProxyAddr,m_Port 里面

CString temp;
char tmpBuffer[1024];
temp.Format("CONNECT %s:%s HTTP/1.1\r\nUser-Agent: MyApp/0.1\r\n\r\n",m_ProxyAddr,m_Port);
if(!SocketSend(HTTPSocket,temp))
{
message="連接代理失敗";
return 0;
}

// 取得代理響應,如果連接代理成功,代理服務器將返回200 Connection established

GetHttpHeader(HTTPSocket,tmpBuffer);
temp=tmpBuffer;
if(temp.Find("HTTP/1.0 200 Connection established",0)==-1)
{
message="連接代理失敗\n";
return 0;
}

message="代理連接完成\n";
m_message.AddText("代理連接完成\n");
return 1; // ----------〉這里是應該注意的,連接到代理后,就可以返回了,不需要再連接網上的另外一臺機,代理服務器會自動轉發數據,所以,連接完代理就像連接到網上另外一臺機一樣
}

// 這個,是為了給其他代理做準備
else if(m_combo=="Socks4")
{MessageBox("請注意,現在無法使用代理功能!");}
else if(m_combo=="Socks5")
{MessageBox("請注意,現在無法使用代理功能!");}


// 如果沒有使用代理,就要連接到網上的另一臺機

// 準備socket
HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if (HTTPSocket==INVALID_SOCKET)
{
AfxMessageBox("Error when socket");
return 0;
}

//設置超時
struct linger zeroLinger;
zeroLinger.l_onoff = 1;
zeroLinger.l_linger = 0;
if(setsockopt(HTTPSocket,SOL_SOCKET,SO_LINGER
,(const char *)&zeroLinger
,sizeof(zeroLinger))!=0)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when setscokopt(LINGER)");
return 0;
}
//設置接收超時
if(setsockopt(HTTPSocket,SOL_SOCKET,SO_RCVTIMEO
,(const char *)&m_nRecvTimeout
,sizeof(m_nRecvTimeout))!=0)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when setsockopt(RCVTIME).");
return 0;
}

//設置發送超時
if(setsockopt(HTTPSocket,SOL_SOCKET,SO_SNDTIMEO
,(const char *)&m_nSendTimeout
,sizeof(m_nSendTimeout))!=0)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when setsockopt(SNDTIMEO).");
return 0;
}


SocketAddr.sin_addr.s_addr = htonl (INADDR_ANY);
SocketAddr.sin_family=AF_INET;

// 進行端口綁定
if (bind (HTTPSocket,
(const struct sockaddr FAR *)&SocketAddr,
sizeof(SocketAddr))==SOCKET_ERROR)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when bind socket.");
return 0;
}

//準備連接

/// 準備連接信息
BindSocket.sin_addr.s_addr = inet_addr (strHost);
BindSocket.sin_family=AF_INET;
BindSocket.sin_port=htons(HttpPort);


struct fd_set fdSet;
struct timeval tmvTimeout={0L,0L};

FD_ZERO(&fdSet);
FD_SET(HTTPSocket, &fdSet);

if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR)
{
closesocket(HTTPSocket);
AfxMessageBox("Error when select.");
return 0;
}

// 連接


if (connect(HTTPSocket, (const struct sockaddr *)&BindSocket, sizeof(BindSocket))==SOCKET_ERROR)
{
AfxMessageBox("第一次連接失敗,準備第二次連接");
if (connect(HTTPSocket
,(const struct sockaddr *)&BindSocket
,sizeof(BindSocket))==SOCKET_ERROR)
{
closesocket(HTTPSocket);
AfxMessageBox("連接失敗");
return 0;
}

}

message="連接完成\n";

return 1;
}


 ?。?)發送http請求,為下載數據進行準備

int CDLAngelDlg::SendHttpHeader()
{
//進行下載

CString temp;
BOOL bReturn;
char tmpBuffer[MAXBLOCKSIZE];


///第1行:方法,請求的路徑,版本
temp="GET "+DownLoadAddress+hostFile+" HTTP/1.0\r\n";
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="發送請求失敗";
return 0;
}


///第2行:主機
temp="Host "+strHost+"\r\n";
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="發送請求失敗";
return 0;
}


///第3行:接收的數據類型
bReturn=SocketSend(HTTPSocket,"Accept: */*\r\n");
if(!bReturn)
{
message="發送請求失敗";
return 0;
}


///第4行:
temp=DownLoadAddress;
temp.Insert(0,"Referer ");
temp+="\r\n";
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="發送請求失敗";
return 0;
}


///第5行:瀏覽器類型

bReturn=SocketSend(HTTPSocket,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; DTS Agent;)\r\n");
if(!bReturn)
{
message="發送請求失敗";
return 0;
}

///第6行:連接設置,保持
// SocketSend(HTTPSocket,"Connection:Keep-Alive\r\n");

///第7行:Cookie.

bReturn=SocketSend(HTTPSocket,"Cache-Control: no-cache\r\n");
if(!bReturn)
{
message="發送請求失敗";
return 0;
}


bReturn=SocketSend(HTTPSocket,"Proxy-Connection: Keep-Alive\r\n");
if(!bReturn)
{
message="發送請求失敗";
return 0;
}

/// 續傳

Range是要下載的數據范圍,對續傳很重要
if(continueFlag)
{
temp.Format("Range: bytes=%d- \r\n",conLength);
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="發送請求失敗";
return 0;
}
}


///最后一行:空行
bReturn=SocketSend(HTTPSocket,"\r\n");
if(!bReturn)
{
message="發送請求失敗";
return 0;
}

///取得http頭
int i;
i=GetHttpHeader(HTTPSocket,tmpBuffer);
if(!i)
{
message="獲取HTTP頭出錯";
return 0;
}

//如果取得的http頭含有404等字樣,則表示連接出問題
temp=tmpBuffer;
if(temp.Find("404")!=-1)
{

return 0;
}

// 得到待下載文件的大小

filelength=GetFileLength(tmpBuffer);

return 1;
}


  這樣,就連接到網上的另一臺機了,如何下載數據,不用多說了吧

while((num!=SOCKET_ERROR) && (num!=0))
{
num=recv (HTTPSocket
,(char FAR *)tmpBuffer
,(MAXBLOCKSIZE-1)
,0);


file.Write(tmpBuffer,num);

if(ExitFlag)
{
file.Close();
closesocket(HTTPSocket);

DownComplete=1;

m_message.CleanText();
m_message.ShowColorText(RGB(128,128,0),DLCompleteMes);

m_progress.ShowWindow(SW_HIDE);
m_stopDownload.ShowWindow(SW_HIDE);
_endthread();
}

}

posted on 2007-07-04 11:24 聶文龍 閱讀(3432) 評論(2)  編輯 收藏 引用 所屬分類: c++

FeedBack:
# re: 用VC++實現http代理 2007-08-08 21:54 聶文龍
http代理源碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <process.h>
#include <windows.h>
#include <assert.h>
#define MAXBUFLEN 20480
#define HTTPADDLEN 50
#define TIMEWAIT 2000
SOCKET Global[1000000];

void DisplayBanner();
void Proxy( void * pSocket);
int ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr);
void ParseError(char * ErrorMsg);

int main(int argc,char * argv[])
{
SOCKET MainSocket,ClientSocket;
struct sockaddr_in Host,Client;
WSADATA WsaData;
int AddLen,i;

//初始化
DisplayBanner();
if(WSAStartup(MAKEWORD(2,2),&WsaData) < 0)
{
printf("dll load error\n");
exit(-1);
}
//創建socket端口
MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(MainSocket == SOCKET_ERROR)
{
ParseError("端口創建錯誤");
}
Host.sin_family = AF_INET;
Host.sin_port = htons(8080);
Host.sin_addr.s_addr = inet_addr("159.226.39.116");
printf("正在工作\n");
//邦定
if(bind(MainSocket,(SOCKADDR *)&Host,sizeof(Host)) != 0)
{
ParseError("邦定錯誤");
}
i = 0;
//監聽
if(listen(MainSocket,5) == SOCKET_ERROR)
{
ParseError("監聽錯誤");
}
AddLen = sizeof(Client);

//連接新的客戶
i = 0;
while(1)
{
ClientSocket = accept(MainSocket,(SOCKADDR *)&Client,&AddLen);
if(ClientSocket == SOCKET_ERROR)
{
ParseError("接受客戶請求錯誤");
}
printf(".");
i ++ ;
if( i >= 1000000)
i = 0;
Global[i] = ClientSocket;

//對于每一個客戶啟動不同的進程進行控制
//這個地方在使用ClientSocket的時候,要不要保證在某一時刻內只能有一個進程使用?
_beginthread(Proxy,0,(void *)&Global[i]);

}



}
void Proxy( void * pSocket)
{
SOCKET ClientSocket;
char ReceiveBuf[MAXBUFLEN];
int DataLen;
struct sockaddr_in ServerAddr;
SOCKET ProxySocket;
int i = 0;
int time = TIMEWAIT;

//得到參數中的端口號信息
ClientSocket = (SOCKET)* (SOCKET*)pSocket;
//接受第一次請求信息
memset(ReceiveBuf,0,MAXBUFLEN);
DataLen = recv(ClientSocket,ReceiveBuf,MAXBUFLEN,0);

if(DataLen == SOCKET_ERROR)
{
ParseError("錯誤\n");
closesocket(ClientSocket);
_endthread();
}
if(DataLen == 0)
{
closesocket(ClientSocket);
_endthread();
}
//處理請求信息,分離出服務器地址
if( ParseHttpRequest(ReceiveBuf,DataLen,(void *)&ServerAddr) < 0)
{
closesocket(ClientSocket);
goto error;
}
//創建新的socket用來和服務器進行連接
ProxySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//設置超時時間
setsockopt(ProxySocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&time,sizeof(time));
if(ProxySocket == SOCKET_ERROR)
{
ParseError("端口創建錯誤");
_endthread();
}
if(connect(ProxySocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR)
{
//ParseError("連接服務器錯誤");
goto error;
}
//開始進行數據傳輸處理
//發送到服務器端
if(send(ProxySocket,ReceiveBuf,DataLen,0) == SOCKET_ERROR)
{
//ParseError("數據發送錯誤");
goto error;

}
//從服務器端接受數據
while(DataLen > 0)
{
memset(ReceiveBuf,0,MAXBUFLEN);

if((DataLen = recv(ProxySocket,ReceiveBuf,MAXBUFLEN,0)) <= 0)
{
// ParseError("數據接受錯誤");
break;

}
else
//發送到客戶端
if(send(ClientSocket,ReceiveBuf,DataLen,0) < 0)
{
// ParseError("數據發送錯誤");
break;
}

}

error:
closesocket(ClientSocket);
closesocket(ProxySocket);
_endthread();
return;

}
int ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr)
{

char * HttpHead = "http://";
char * FirstLocation = NULL;
char * LastLocation = NULL;
char * PortLocation = NULL;
char ServerName[HTTPADDLEN];
char PortString[10];
int NameLen;
struct hostent * pHost;
struct sockaddr_in * pServer = (struct sockaddr_in *)ServerAddr;
//取得http://的位置
FirstLocation = strstr(SourceBuf,HttpHead) + strlen(HttpHead);
//取得/的位置
LastLocation = strstr(FirstLocation,"/");

//得到http://和/之間的服務器的名稱

memset(ServerName,0,HTTPADDLEN);
memcpy(ServerName,FirstLocation,LastLocation - FirstLocation);

//有些情況下,請求的地址中帶有端口號格式為“:+ 端口號”;
//取得 :的位置
PortLocation = strstr(ServerName,":");


//填充server結構
pServer->sin_family = AF_INET;
//在url中制定了服務器端口
if(PortLocation != NULL)
{
NameLen = PortLocation - ServerName -1;
memset(PortString,0,10);
memcpy(PortString,PortLocation + 1,NameLen);
pServer->sin_port = htons((u_short)atoi(PortString));
*PortLocation = 0;
}
else//在url中,沒有制定服務器端口
{
pServer->sin_port = htons(80);
}

if(NameLen > HTTPADDLEN)
{
ParseError("服務器名字太長");
return -1;
}

//得到服務器信息
//如果地址信息是以IP地址(202.194.7.1)的形式出現的
if(ServerName[0] >= '0' && ServerName[0] <= '9')
{

pServer->sin_addr.s_addr = inet_addr(ServerName);
}
//以域名的形式出現的(www.sina.com.cn)
else
{
pHost = (struct hostent *)gethostbyname(ServerName);
if(!pHost)
{
printf("取得主機信息錯誤\n");
printf("%s\n",ServerName);
return -1;
}
memcpy(&pServer->sin_addr,pHost->h_addr_list[0],sizeof(pServer->sin_addr));
}

return 0;
}
void ParseError(char * ErrorMsg)
{
// printf("%s %d\n",ErrorMsg,GetLastError());
// WSACleanup();
// exit(-1);
}
void DisplayBanner()
{
printf("=================================================\n");
printf("==== ====\n");
printf("==== HTTP PROXY v2.0 ====\n");
printf("==== ====\n");
printf("=================================================\n");
}



  回復  更多評論
  
# re: 用VC++實現http代理 2007-08-08 22:56 聶文龍
#include "stdafx.h"
#include "Proxy.h"
#include < winsock2.h > //WINSOCKET API 2。0
#include < stdlib.h >
#include < stdio.h >
#include < string.h >

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////


#define HTTP "http://"
#define FTP "ftp://"
#define PROXYPORT 5001 //Proxy 端口
#define BUFSIZE 10240 //緩沖區大小


CWinApp theApp;

using namespace std;

UINT ProxyToServer(LPVOID pParam);
UINT UserToProxyThread(void *pParam);

struct SocketPair{
SOCKET user_proxy; //socket : 本地機器到PROXY 服務機
SOCKET proxy_server; //socket : PROXY 服務機到遠程主機
BOOL IsUser_ProxyClosed; // 本地機器到PROXY 服務機狀態
BOOL IsProxy_ServerClosed; // PROXY 服務機到遠程主機狀態
};


struct ProxyParam{
char Address[256]; // 遠程主機地址
HANDLE User_SvrOK; // PROXY 服務機到遠程主機的聯結狀態
SocketPair *pPair; // 維護一組SOCKET的指針
int Port; // 用來聯結遠程主機的端口
}; //這個結構用來PROXY SERVER與遠程主機的信息交換.

SOCKET gListen_Socket; //用來偵聽的SOCKET。

int StartServer() //啟動服務
{
WSADATA wsaData;
sockaddr_in local;
SOCKET listen_socket;

if(::WSAStartup(0x202,&wsaData)!=0)
{printf("\nError in Startup session.\n");WSACleanup();return -1;};

local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(PROXYPORT);

listen_socket=socket(AF_INET,SOCK_STREAM,0);
if(listen_socket==INVALID_SOCKET)
{printf("\nError in New a Socket.");WSACleanup();return -2;}

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

if(::listen(listen_socket,5)!=0)
{printf("\n Error in Listen."); WSACleanup(); return -4;}
gListen_Socket=listen_socket;
AfxBeginThread(UserToProxyThread,NULL); //啟動偵聽
return 1;
}

int CloseServer() //關閉服務
{
closesocket(gListen_Socket);
WSACleanup();
return 1;
}
//分析接收到的字符,得到遠程主機地址

int GetAddressAndPort( char * str, char *address, int * port)
{
char buf[BUFSIZE], command[512], proto[128], *p;
int j;
sscanf(str,"%s%s%s",command,buf,proto);
p=strstr(buf,HTTP);
//HTTP
if(p)
{
p+=strlen(HTTP);
for(int i=0;i< strlen(p);i++)
if( *(p+i)=='/') break;
*(p+i)=0;
strcpy(address,p);
p=strstr(str,HTTP);
for(int j=0;j< i+strlen(HTTP);j++)
*(p+j)=' '; //去掉遠程主機名: GET http:/www.csdn.net/ HTTP1.1 == > GET / HTTP1.1
*port=80; //缺省的 http 端口
}
else
{//FTP, 不支持, 下面的代碼可以省略.
p=strstr(buf,FTP);
if(!p) return 0;
p+=strlen(FTP);
for(int i=0;i< strlen(p);i++)
if( *(p+i)=='/') break; //Get The Remote Host
*(p+i)=0;
for(j=0;j< strlen(p);j++)
if(*(p+j)==':')
{*port=atoi(p+j+1); //Get The Port
*(p+j)=0;
}
else *port=21;

strcpy(address,p);
p=strstr(str,FTP);
for(j=0;j< i+strlen(FTP);j++)
*(p+j)=' ';
}
return 1;
}

// 取到本地的數據,發往遠程主機
UINT UserToProxyThread(void *pParam)
{
char Buffer[BUFSIZE];
int Len;
sockaddr_in from;
SOCKET msg_socket;
int fromlen,retval;
SocketPair SPair;
ProxyParam ProxyP;
CWinThread *pChildThread;
fromlen=sizeof(from);
msg_socket=accept(gListen_Socket,(struct sockaddr*)&from,&fromlen);
AfxBeginThread(UserToProxyThread,pParam); //啟動另一偵聽.
if( msg_socket==INVALID_SOCKET)
{ printf( "\nError in accept "); return -5;}
//讀客戶的第一行數據

SPair.IsUser_ProxyClosed=FALSE;
SPair.IsProxy_ServerClosed=TRUE;
SPair.user_proxy=msg_socket;

retval=recv(SPair.user_proxy,Buffer,sizeof(Buffer),0);

if(retval==SOCKET_ERROR)
{ printf("\nError Recv");
if(SPair.IsUser_ProxyClosed==FALSE)
{closesocket(SPair.user_proxy);
SPair.IsUser_ProxyClosed=TRUE;
}
}
if(retval==0)
{printf("Client Close connection\n");
if(SPair.IsUser_ProxyClosed==FALSE)
{closesocket(SPair.user_proxy);
SPair.IsUser_ProxyClosed=TRUE;
}
}
Len=retval;
#ifdef _DEBUG

Buffer[Len]=0;
printf("\n Received %d bytes,data[%s]from client\n",retval,Buffer);
#endif
//
SPair.IsUser_ProxyClosed=FALSE;
SPair.IsProxy_ServerClosed=TRUE;
SPair.user_proxy=msg_socket;

ProxyP.pPair=&SPair;
ProxyP.User_SvrOK=CreateEvent(NULL,TRUE,FALSE,NULL);

GetAddressAndPort( Buffer,ProxyP.Address,&ProxyP.Port);

pChildThread=AfxBeginThread(ProxyToServer,(LPVOID)&ProxyP);
::WaitForSingleObject(ProxyP.User_SvrOK,60000); //等待聯結
::CloseHandle(ProxyP.User_SvrOK);

while(SPair.IsProxy_ServerClosed ==FALSE && SPair.IsUser_ProxyClosed==FALSE)
{
retval=send(SPair.proxy_server,Buffer,Len,0);
if(retval==SOCKET_ERROR)
{ printf("\n send() failed:error%d\n",WSAGetLastError());
if(SPair.IsProxy_ServerClosed==FALSE)
{
closesocket(SPair.proxy_server);
SPair.IsProxy_ServerClosed=TRUE;
}
continue;
}
retval=recv(SPair.user_proxy,Buffer,sizeof(Buffer),0);

if(retval==SOCKET_ERROR)
{ printf("\nError Recv");
if(SPair.IsUser_ProxyClosed==FALSE)
{closesocket(SPair.user_proxy);
SPair.IsUser_ProxyClosed=TRUE;
}
continue;
}
if(retval==0)
{printf("Client Close connection\n");
if(SPair.IsUser_ProxyClosed==FALSE)
{closesocket(SPair.user_proxy);
SPair.IsUser_ProxyClosed=TRUE;
}
break;
}
Len=retval;
#ifdef _DEBUG
Buffer[Len]=0;
printf("\n Received %d bytes,data[%s]from client\n",retval,Buffer);
#endif

} //End While

if(SPair.IsProxy_ServerClosed==FALSE)
{
closesocket(SPair.proxy_server);
SPair.IsProxy_ServerClosed=TRUE;
}
if(SPair.IsUser_ProxyClosed==FALSE)
{closesocket(SPair.user_proxy);
SPair.IsUser_ProxyClosed=TRUE;
}
::WaitForSingleObject(pChildThread- >m_hThread,20000); //Should check the return value
return 0;
}
// 讀取遠程主機數據,并發往本地客戶機
UINT ProxyToServer(LPVOID pParam){
ProxyParam * pPar=(ProxyParam*)pParam;
char Buffer[BUFSIZE];
char *server_name= "localhost";
unsigned short port ;
int retval,Len;
unsigned int addr;
int socket_type ;
struct sockaddr_in server;
struct hostent *hp;
SOCKET conn_socket;

socket_type = SOCK_STREAM;
server_name = pPar- >Address;
port = pPar- >Port;

if (isalpha(server_name[0])) { /* server address is a name */
hp = gethostbyname(server_name);
}
else { /* Convert nnn.nnn address to a usable one */
addr = inet_addr(server_name);
hp = gethostbyaddr((char *)&addr,4,AF_INET);
}
if (hp == NULL ) {
fprintf(stderr,"Client: Cannot resolve address [%s]: Error %d\n",
server_name,WSAGetLastError());
::SetEvent(pPar- >User_SvrOK);
return 0;
}

//
// Copy the resolved information into the sockaddr_in structure
//
memset(&server,0,sizeof(server));
memcpy(&(server.sin_addr),hp- >h_addr,hp- >h_length);
server.sin_family = hp- >h_addrtype;
server.sin_port = htons(port);

conn_socket = socket(AF_INET,socket_type,0); /* 打開一個 socket */
if (conn_socket < 0 ) {
fprintf(stderr,"Client: Error Opening socket: Error %d\n",
WSAGetLastError());
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
::SetEvent(pPar- >User_SvrOK);
return -1;
}
#ifdef _DEBUG
printf("Client connecting to: %s\n",hp- >h_name);
#endif
if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server))
== SOCKET_ERROR) {
fprintf(stderr,"connect() failed: %d\n",WSAGetLastError());
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
::SetEvent(pPar- >User_SvrOK);
return -1;
}
pPar- >pPair- >proxy_server=conn_socket;
pPar- >pPair- >IsProxy_ServerClosed=FALSE;
::SetEvent(pPar- >User_SvrOK);
// cook up a string to send
while(!pPar- >pPair- >IsProxy_ServerClosed &&!pPar- >pPair- >IsUser_ProxyClosed)
{
retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
if (retval == SOCKET_ERROR ) {
fprintf(stderr,"recv() failed: error %d\n",WSAGetLastError());
closesocket(conn_socket);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
break;
}
Len=retval;
if (retval == 0) {
printf("Server closed connection\n");
closesocket(conn_socket);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
break;
}

retval = send(pPar- >pPair- >user_proxy,Buffer,Len,0);
if (retval == SOCKET_ERROR) {
fprintf(stderr,"send() failed: error %d\n",WSAGetLastError());
closesocket(pPar- >pPair- >user_proxy);
pPar- >pPair- >IsUser_ProxyClosed=TRUE;
break;
}
#ifdef _DEBUG
Buffer[Len]=0;
printf("Received %d bytes, data [%s] from server\n",retval,Buffer);
#endif
}
if(pPar- >pPair- >IsProxy_ServerClosed==FALSE)
{
closesocket(pPar- >pPair- >proxy_server);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
}
if(pPar- >pPair- >IsUser_ProxyClosed==FALSE)
{closesocket(pPar- >pPair- >user_proxy);
pPar- >pPair- >IsUser_ProxyClosed=TRUE;
}
return 1;
}



int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// 初始化SOCKET
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// 錯誤處理
cerr < < _T("Fatal Error: MFC initialization failed") < < endl;
nRetCode = 1;
}
else
{
// 主程序開始.
StartServer();
while(1)
if(getchar()=='q') break;
CloseServer();
}

return nRetCode;
}


  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲天堂网在线观看| 麻豆91精品91久久久的内涵| 欧美精品在线观看一区二区| 亚洲一级一区| 91久久国产综合久久| 欧美一级网站| 亚洲在线观看视频网站| 亚洲区一区二区三区| 亚洲国产日韩欧美| 免费一级欧美片在线观看| 久久亚洲二区| 久久久久久久久伊人| 欧美在线三级| 美女黄网久久| 欧美福利专区| 国产精品日韩二区| 一区二区电影免费观看| 精品成人久久| 在线观看成人av电影| 伊人狠狠色丁香综合尤物| 亚洲第一成人在线| 日韩视频不卡中文| 一区二区日韩欧美| 午夜亚洲一区| 久久综合色一综合色88| 欧美国产日韩精品| 日韩午夜激情av| 亚洲欧美亚洲| 久久夜色精品国产| 欧美精品播放| 久久9热精品视频| 中日韩午夜理伦电影免费| 亚洲作爱视频| 久久精品久久综合| 麻豆精品网站| 日韩视频在线你懂得| 亚洲综合国产| 久久综合给合| 欧美特黄一区| 国产婷婷色一区二区三区四区| 国产日韩欧美亚洲| 亚洲黄色在线看| 亚洲欧美变态国产另类| 久久中文字幕一区| 日韩视频在线一区| 午夜久久久久久| 亚洲综合色自拍一区| 久久精品亚洲一区| 欧美日韩视频在线一区二区观看视频| 国产精品一级久久久| 亚洲国产精品激情在线观看| 亚洲永久免费av| 亚洲第一网站| 午夜日韩在线观看| 欧美日韩国产电影| 一区二区三区在线不卡| 亚洲一区二区三区视频播放| 免费在线观看成人av| 亚洲第一精品夜夜躁人人躁| 久久婷婷国产综合精品青草| 亚洲一区二区精品在线观看| 欧美黄在线观看| 亚洲综合大片69999| 蜜臀av国产精品久久久久| 狠狠色狠狠色综合日日五| 亚洲欧美制服另类日韩| 亚洲天天影视| 国产精品mm| 亚洲一区国产一区| 一本色道久久综合| 欧美精选在线| 99国产精品久久久久老师 | 欧美天堂在线观看| 亚洲黄网站在线观看| 久久中文欧美| 久久激情中文| 国内精品久久久久久久97牛牛| 亚洲欧美精品在线| 一本大道av伊人久久综合| 欧美日韩午夜在线视频| 国产精品99久久久久久久久久久久 | 国产主播一区二区三区四区| 亚洲欧洲一区二区在线播放| 另类国产ts人妖高潮视频| 欧美在线视频二区| 欧美二区在线看| 精品不卡一区二区三区| 国产精品自拍在线| 欧美一区亚洲| 欧美在线播放| 在线日韩中文字幕| 亚洲国产激情| 欧美午夜精品久久久久免费视 | 欧美日韩国产小视频| 亚洲精选中文字幕| 99精品国产热久久91蜜凸| 欧美香蕉大胸在线视频观看| 亚洲欧美日韩在线综合| 亚洲欧美日韩一区二区三区在线| 国产美女精品视频| 久久综合国产精品台湾中文娱乐网| 亚洲视频自拍偷拍| 国产一区白浆| 欧美国产日韩在线| 欧美日韩免费高清| 欧美一区免费| 久久久水蜜桃av免费网站| 亚洲精品极品| 亚洲综合日韩中文字幕v在线| 国产日韩欧美自拍| 欧美国产第二页| 欧美日韩一本到| 久久精品91久久久久久再现| 老司机精品久久| 亚洲欧美激情一区二区| 午夜精品福利电影| 亚洲激情综合| 亚洲精品日韩在线观看| 欧美激情第二页| 在线观看日韩精品| 亚洲一区综合| 欧美高清视频一区二区三区在线观看| 亚洲激情av| 一本一本久久a久久精品综合妖精| 欧美成人亚洲成人| 一区二区三区日韩精品视频| 亚洲欧美日韩精品久久亚洲区| 香蕉久久夜色精品国产| 久久三级视频| 亚洲黄色视屏| 欧美日韩国产欧美日美国产精品| 性色av一区二区三区在线观看| 99国产精品国产精品毛片| 欧美日韩在线不卡一区| 亚洲欧洲精品一区二区| 亚洲高清影视| 欧美日韩高清免费| 亚洲免费影视| 免费久久99精品国产自在现线| 亚洲黄色一区| 国产精品午夜在线观看| 久久久免费观看视频| 亚洲精品影院在线观看| 欧美一区二区成人6969| 精品成人免费| 欧美三级资源在线| 久久久久久久激情视频| 亚洲日韩第九十九页| 欧美在线视频一区| 在线观看视频一区二区| 欧美少妇一区二区| 久久精品一区二区三区不卡牛牛| 欧美激情aⅴ一区二区三区| 亚洲欧美精品在线观看| 欧美性一区二区| 久久米奇亚洲| 亚洲在线一区| 欧美大片在线观看| 午夜精品视频网站| 亚洲精品一区二区在线| 国产精品视频免费观看| 欧美成人午夜剧场免费观看| 午夜亚洲影视| 日韩午夜在线观看视频| 亚洲欧美综合| 亚洲高清久久| 国产三级精品在线不卡| 欧美精品一区二区三区在线播放 | 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一区二区三区久久精品茉莉花| 在线免费高清一区二区三区| 国产片一区二区| 国产精品草草| 国产精品播放| 性欧美暴力猛交69hd| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲欧美日韩精品久久奇米色影视| 亚洲美女视频网| 亚洲精品乱码久久久久久日本蜜臀 | 国产精品中文在线| 国产精品免费小视频| 国产精品激情电影| 国产精品久久一级| 国产精品免费小视频| 国产日本欧美一区二区| 国产区二精品视| 在线电影欧美日韩一区二区私密| 狠狠久久婷婷| 亚洲片在线资源| 在线视频精品一| 亚洲欧美在线视频观看| 久久精品成人欧美大片古装| 欧美在线影院在线视频| 久久亚洲综合色一区二区三区| 老巨人导航500精品| 亚洲第一页自拍| 亚洲伦理久久| 亚洲综合社区| 久久综合久久综合久久综合| 欧美国产视频在线观看|