急求!!!Http代理客户端代码,vc编写,分全进去了!!! 求基于对话框的源代码,就是象花刺代理一样的,可以连接远程服务器,能简单的设置代理WEB站点的IP、端口。设置的代理WEB站点的IP、端口能在IE的Internet选项里看出,急呀 !!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 通用型的程序代码片段:sock4,sock5,http1.1.我使用CblockingSock进行socket传输.你可以改成你自己用的如Csocket.struct sock4req1{ char VN; char CD; unsigned short Port; unsigned long IPAddr; char other[1];};struct sock4ans1{ char VN; char CD;};struct sock5req1{ char Ver; char nMethods; char Methods[255];};struct sock5ans1{ char Ver; char Method;};struct sock5req2{ char Ver; char Cmd; char Rsv; char Atyp; char other[1];};struct sock5ans2{ char Ver; char Rep; char Rsv; char Atyp; char other[1];};struct authreq{ char Ver; char Ulen; char Name[3]; char PLen; char Pass[3];};struct authans{ char Ver; char Status;};CBlockingSocket socketServer,socketClient,socketProxy;socketClient.Create();char* buffer = new char[50000];try { //判断代理类型,使用各种代理的处理 char buff[600]; switch(m_nProxyType) { case PROXYTYPE_NOPROXY: //不使用代理直接连接 { saServer = CBlockingSocket::GetHostByName(m_strServerName, m_nPort); socketClient.Connect(saServer); break; } case PROXYTYPE_SOCK4: { saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort); socketClient.Connect(saServer); memset(buff,0,600); struct sock4req1 *m_proxyreq; m_proxyreq = (struct sock4req1 *)buff; m_proxyreq->VN = 4; m_proxyreq->CD = 1; m_proxyreq->Port = ntohs(m_nPort); m_proxyreq->IPAddr = inet_addr(m_strServerName); socketClient.Send(buff,9,0); struct sock4ans1 *m_proxyans; m_proxyans = (struct sock4ans1 *)buff; memset(buff,0,600); socketClient.Receive(buff,600,10); if(m_proxyans->VN != 0 || m_proxyans->CD != 90) { //g_CurStateCode=-6002; //g_CurStateLog="通过代理连接主站不成功!"; socketClient.Close(); return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE; } break; } case PROXYTYPE_SOCK4A: { saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort); socketClient.Connect(saServer); memset(buff,0,600); struct sock4req1 *m_proxyreq; m_proxyreq = (struct sock4req1 *)buff; m_proxyreq->VN = 4; m_proxyreq->CD = 1; m_proxyreq->Port = ntohs(m_nPort); m_proxyreq->IPAddr = inet_addr(m_strServerName); socketClient.Send(buff,9,0); struct sock4ans1 *m_proxyans; m_proxyans = (struct sock4ans1 *)buff; memset(buff,0,600); socketClient.Receive(buff,600,10); if(m_proxyans->VN != 0 || m_proxyans->CD != 90) { //g_CurStateCode=-6002; //g_CurStateLog="通过代理连接主站不成功!"; socketClient.Close(); return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE; } break; } //使用SOCK5代理服务器连接 case PROXYTYPE_SOCK5: { saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort); socketClient.Connect(saServer); struct sock5req1 *m_proxyreq1; m_proxyreq1 = (struct sock5req1 *)buff; memset(m_proxyreq1,0,sizeof(m_proxyreq1)); if (m_bUseProxyLogin) { m_proxyreq1->Ver = 5; m_proxyreq1->nMethods = 1; m_proxyreq1->Methods[0] = 2; } else { m_proxyreq1->Ver = 5; m_proxyreq1->nMethods = 1; m_proxyreq1->Methods[0] = 0; } socketClient.Send(buff,3,0); struct sock5ans1 *m_proxyans1; m_proxyans1 = (struct sock5ans1 *)buff; unsigned long tmpLong1 = inet_addr(m_strServerName); unsigned short port1 = ntohs(m_nPort); memset(buff,0,600); socketClient.Receive(buff,600,10); if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2)) { socketClient.Close(); delete [] buffer; return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE; } if(m_proxyans1->Method == 2) { int nUserLen = strlen(m_strProxyUser); int nPassLen = strlen(m_strProxyPwd); struct authreq *m_authreq; m_authreq = (struct authreq *)buff; memset(m_authreq,0,sizeof(m_authreq)); m_authreq->Ver = 1; m_authreq->Ulen = nUserLen; strcpy(m_authreq->Name,m_strProxyUser); m_authreq->PLen = nPassLen; strcpy(m_authreq->Pass,m_strProxyPwd); int s1=sizeof(authreq); //socketClient.Receive(buff,sizeof(authans),60); socketClient.Send(buff,sizeof(authreq),0); struct authans *m_authans; m_authans = (struct authans *)buff; memset(buff,0,600); int recvResult=socketClient.Receive(buff,sizeof(authans),60); if(m_authans->Ver != 1 || m_authans->Status != 0) { socketClient.Close(); delete [] buffer; return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE; } } struct sock5req2 *m_proxyreq2; m_proxyreq2 = (struct sock5req2 *)buff; m_proxyreq2->Ver = 5; m_proxyreq2->Cmd = 1; m_proxyreq2->Rsv = 0; m_proxyreq2->Atyp = 1; unsigned long tmpLong = inet_addr(m_strServerName); unsigned short port = ntohs(m_nPort); memcpy(m_proxyreq2->other,&tmpLong,4); memcpy(m_proxyreq2->other+4,&port,2); socketClient.Send(buff,sizeof(struct sock5req2)+5,0); struct sock5ans2 *m_proxyans2; memset(buff,0,600); m_proxyans2 = (struct sock5ans2 *)buff; int nResult1=socketClient.Receive(buff,600,10); if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0) { //g_CurStateCode=-6004; //g_CurStateLog="通过代理连接主站不成功!"; socketClient.Close(); delete [] buffer; return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE; } break; } case PROXYTYPE_HTTP11: { saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort); socketClient.Connect(saServer); CString str="",str1=""; if (!m_bUseProxyLogin) { str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort, m_strServerName,m_nPort); str1="Accept: */*\r\n" "Content-Type: text/html\r\n" "Proxy-Connection: Keep-Alive\r\n" "Content-length: 0\r\n\r\n"; str+=str1; } else { str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort, m_strServerName,m_nPort); str1="Accept: */*\r\n" "Content-Type: text/html\r\n" "Proxy-Connection: Keep-Alive\r\n" "Content-length: 0\r\n"; str+=str1; CString userpass; CString base64str; if (!m_strProxyDomain.IsEmpty()) { userpass.Format("%s:%s",m_strProxyDomain+"\\"+m_strProxyUser,m_strProxyPwd); } else { userpass.Format("%s:%s",m_strProxyUser,m_strProxyPwd); } char chrBase64[4096]; EncodeBase64(userpass.GetBuffer(userpass.GetLength()),chrBase64,userpass.GetLength(),userpass.GetLength()*3); base64str=chrBase64; str+="Authorization: Basic "+base64str+"\r\n"; str+="Proxy-Authorization: Basic "+base64str+"\r\n"; if (!m_strProxyDomain.IsEmpty()) { CString strrealmDomain; strrealmDomain.Format("WWW-Authenticate: Negotiate\r\nWWW-Authenticate: NTLM\r\nWWW-Authenticate: Basic realm=%s\r\n",m_strProxyDomain); str+=strrealmDomain; } } str+="\r\n"; int numsent=socketClient.Send(str,str.GetLength(),0); CString strResultBuffer=""; while (1) { int nProxyresult=socketClient.Receive(buff,600,60); strResultBuffer+=buff; if (nProxyresult==-1 || nProxyresult==0 || nProxyresult<600) break; } if(strResultBuffer.Find("HTTP/1.0 200")==-1) //连接不成功 { CFile cfile; cfile.Open("HttpProxyRev.LOG",CFile::modeCreate|CFile::modeWrite); cfile.Write(buff,600); cfile.Close(); socketClient.Close(); return -6004; } break; } default: break; } char chrDRZData[1024]; int nConnectHeadSize=0; CFile fConnectFile; CFileException pfe; if (fConnectFile.Open("HttpConnect.dat",CFile::modeRead|CFile::typeBinary,&pfe)) { int dwRead=0; nConnectHeadSize=fConnectFile.GetLength(); while(dwRead<nConnectHeadSize) { memset( chrDRZData , 0 ,1024 ); UINT dw=fConnectFile.Read(chrDRZData, 1024); if (dw==1024) { socketClient.Send(chrDRZData,1024,3); } else { socketClient.Send(chrDRZData,dw,3); } dwRead+=dw; } fConnectFile.Close(); //g_CurStateCode=1001;//发送成功 //g_CurStateLog="发送数据请求成功,等待服务器反馈!"; }else { return HTTP_TRANSFERS_FILE_ERROR_CODE; } 这是我在网上找的代码,不知下面该怎么写:{ char pszMSG[1024]; int iRet;// sockaddr_in proxyaddr;//代理服务器地址结构 SOCKET sckClient; //客户端 CClient* pServer=(CClient*)lpVoid; pServer->OUTPUT(pServer,"Connecting to the proxy.\r\n"); proxyaddr.sin_family = AF_INET; proxyaddr.sin_port = htons(pServer->m_Info.nPort);//取服务器端口并转化 proxyaddr.sin_addr.s_addr = inet_addr(pServer->m_Info.strProxyAddr);//取服务器地址 sckClient = socket(AF_INET, SOCK_STREAM, 0); if(sckClient==INVALID_SOCKET) //没有创建成功则给窗口发送消息 { closesocket(pThreadParam->sckClient); closesocket(sckClient); //sprintf将错误信息转化为pszMsg。 sprintf(pszMsg, "socket()=INVALID_SOCKET, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError()); pServer->OUTPUT(pServer,pszMsg); goto _ThreadExit1; } //与代理服务器连接 iRet = connect(sckClient, (const sockaddr*)&proxyaddr, sizeof(proxyaddr)); if(iRet==SOCKET_ERROR) { closesocket(pThreadParam->sckClient); closesocket(sckClient); sprintf(pszMsg, "connect()=SOCKET_ERROR, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError()); pServer->OUTPUT(pServer,pszMsg); } http代理最简单了,get里面写目标url的完整而不是相对路径就可以了,还有,别忘记设置host为目标url的host 内部推荐职位---杭州 嗯,关于多文档菜单“文件”的提问 TRY ... CATCH_ALL(e)只能够catch mfc的异常CException,如果抛出的非mfc异常,那么它是catch不到的吧,程序如何组织才能catch所有的错 VC vs VB 还是这里人气比较旺,问题一个有关C#的问题. 名称空间问题!STD:::?!!! vc中怎样才能像vb那样可以将一段代码注释掉? 请教各位高手一个关于CString 的小问题! 请问哪个地方有: VC6 MFC 类库参考大全下载 求《windows核心编程》的随书源码 工程之间通信问题 请问怎么把CString转换为WString?
// 通用型的程序代码片段:sock4,sock5,http1.1.我使用CblockingSock进行socket传输.你可以改成你自己用的如Csocket.
struct sock4req1
{
char VN;
char CD;
unsigned short Port;
unsigned long IPAddr;
char other[1];
};struct sock4ans1
{
char VN;
char CD;
};struct sock5req1
{
char Ver;
char nMethods;
char Methods[255];
};struct sock5ans1
{
char Ver;
char Method;
};struct sock5req2
{
char Ver;
char Cmd;
char Rsv;
char Atyp;
char other[1];
};struct sock5ans2
{
char Ver;
char Rep;
char Rsv;
char Atyp;
char other[1];
};struct authreq
{
char Ver;
char Ulen;
char Name[3];
char PLen;
char Pass[3];
};struct authans
{
char Ver;
char Status;
};
CBlockingSocket socketServer,socketClient,socketProxy;
socketClient.Create();
char* buffer = new char[50000];
try {
//判断代理类型,使用各种代理的处理
char buff[600];
switch(m_nProxyType)
{
case PROXYTYPE_NOPROXY:
//不使用代理直接连接
{
saServer = CBlockingSocket::GetHostByName(m_strServerName, m_nPort);
socketClient.Connect(saServer);
break;
}
case PROXYTYPE_SOCK4:
{
saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
socketClient.Connect(saServer);
memset(buff,0,600);
struct sock4req1 *m_proxyreq;
m_proxyreq = (struct sock4req1 *)buff;
m_proxyreq->VN = 4;
m_proxyreq->CD = 1;
m_proxyreq->Port = ntohs(m_nPort);
m_proxyreq->IPAddr = inet_addr(m_strServerName);
socketClient.Send(buff,9,0);
struct sock4ans1 *m_proxyans;
m_proxyans = (struct sock4ans1 *)buff;
memset(buff,0,600);
socketClient.Receive(buff,600,10);
if(m_proxyans->VN != 0 || m_proxyans->CD != 90)
{
//g_CurStateCode=-6002;
//g_CurStateLog="通过代理连接主站不成功!";
socketClient.Close();
return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
}
break;
}
case PROXYTYPE_SOCK4A:
{
saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
socketClient.Connect(saServer);
memset(buff,0,600);
struct sock4req1 *m_proxyreq;
m_proxyreq = (struct sock4req1 *)buff;
m_proxyreq->VN = 4;
m_proxyreq->CD = 1;
m_proxyreq->Port = ntohs(m_nPort);
m_proxyreq->IPAddr = inet_addr(m_strServerName);
socketClient.Send(buff,9,0);
struct sock4ans1 *m_proxyans;
m_proxyans = (struct sock4ans1 *)buff;
memset(buff,0,600);
socketClient.Receive(buff,600,10);
if(m_proxyans->VN != 0 || m_proxyans->CD != 90)
{
//g_CurStateCode=-6002;
//g_CurStateLog="通过代理连接主站不成功!";
socketClient.Close();
return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
}
break;
}
case PROXYTYPE_SOCK5:
{
saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
socketClient.Connect(saServer);
struct sock5req1 *m_proxyreq1;
m_proxyreq1 = (struct sock5req1 *)buff;
memset(m_proxyreq1,0,sizeof(m_proxyreq1));
if (m_bUseProxyLogin)
{
m_proxyreq1->Ver = 5;
m_proxyreq1->nMethods = 1;
m_proxyreq1->Methods[0] = 2;
}
else
{
m_proxyreq1->Ver = 5;
m_proxyreq1->nMethods = 1;
m_proxyreq1->Methods[0] = 0;
}
socketClient.Send(buff,3,0);
struct sock5ans1 *m_proxyans1;
m_proxyans1 = (struct sock5ans1 *)buff; unsigned long tmpLong1 = inet_addr(m_strServerName);
unsigned short port1 = ntohs(m_nPort); memset(buff,0,600);
socketClient.Receive(buff,600,10); if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2))
{
socketClient.Close();
delete [] buffer;
return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
}
if(m_proxyans1->Method == 2)
{
int nUserLen = strlen(m_strProxyUser);
int nPassLen = strlen(m_strProxyPwd);
struct authreq *m_authreq;
m_authreq = (struct authreq *)buff;
memset(m_authreq,0,sizeof(m_authreq));
m_authreq->Ver = 1;
m_authreq->Ulen = nUserLen;
strcpy(m_authreq->Name,m_strProxyUser);
m_authreq->PLen = nPassLen;
strcpy(m_authreq->Pass,m_strProxyPwd);
int s1=sizeof(authreq);
//socketClient.Receive(buff,sizeof(authans),60);
socketClient.Send(buff,sizeof(authreq),0);
struct authans *m_authans;
m_authans = (struct authans *)buff;
memset(buff,0,600);
int recvResult=socketClient.Receive(buff,sizeof(authans),60);
if(m_authans->Ver != 1 || m_authans->Status != 0)
{
socketClient.Close();
delete [] buffer;
return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
}
}
struct sock5req2 *m_proxyreq2;
m_proxyreq2 = (struct sock5req2 *)buff;
m_proxyreq2->Ver = 5;
m_proxyreq2->Cmd = 1;
m_proxyreq2->Rsv = 0;
m_proxyreq2->Atyp = 1;
unsigned long tmpLong = inet_addr(m_strServerName);
unsigned short port = ntohs(m_nPort);
memcpy(m_proxyreq2->other,&tmpLong,4);
memcpy(m_proxyreq2->other+4,&port,2);
socketClient.Send(buff,sizeof(struct sock5req2)+5,0);
struct sock5ans2 *m_proxyans2;
memset(buff,0,600);
m_proxyans2 = (struct sock5ans2 *)buff;
int nResult1=socketClient.Receive(buff,600,10);
if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0)
{
//g_CurStateCode=-6004;
//g_CurStateLog="通过代理连接主站不成功!";
socketClient.Close();
delete [] buffer;
return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
}
break;
}
{
saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
socketClient.Connect(saServer);
CString str="",str1="";
if (!m_bUseProxyLogin)
{
str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort,
m_strServerName,m_nPort);
str1="Accept: */*\r\n"
"Content-Type: text/html\r\n"
"Proxy-Connection: Keep-Alive\r\n"
"Content-length: 0\r\n\r\n";
str+=str1;
}
else
{
str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort,
m_strServerName,m_nPort);
str1="Accept: */*\r\n"
"Content-Type: text/html\r\n"
"Proxy-Connection: Keep-Alive\r\n"
"Content-length: 0\r\n";
str+=str1;
CString userpass;
CString base64str;
if (!m_strProxyDomain.IsEmpty())
{
userpass.Format("%s:%s",m_strProxyDomain+"\\"+m_strProxyUser,m_strProxyPwd);
}
else
{
userpass.Format("%s:%s",m_strProxyUser,m_strProxyPwd);
}
char chrBase64[4096];
EncodeBase64(userpass.GetBuffer(userpass.GetLength()),chrBase64,userpass.GetLength(),userpass.GetLength()*3);
base64str=chrBase64;
str+="Authorization: Basic "+base64str+"\r\n";
str+="Proxy-Authorization: Basic "+base64str+"\r\n";
if (!m_strProxyDomain.IsEmpty())
{
CString strrealmDomain;
strrealmDomain.Format("WWW-Authenticate: Negotiate\r\nWWW-Authenticate: NTLM\r\nWWW-Authenticate: Basic realm=%s\r\n",m_strProxyDomain);
str+=strrealmDomain;
}
}
str+="\r\n";
int numsent=socketClient.Send(str,str.GetLength(),0);
CString strResultBuffer="";
while (1) {
int nProxyresult=socketClient.Receive(buff,600,60);
strResultBuffer+=buff;
if (nProxyresult==-1 || nProxyresult==0 || nProxyresult<600) break;
}
if(strResultBuffer.Find("HTTP/1.0 200")==-1) //连接不成功
{
CFile cfile;
cfile.Open("HttpProxyRev.LOG",CFile::modeCreate|CFile::modeWrite);
cfile.Write(buff,600);
cfile.Close();
socketClient.Close();
return -6004;
}
break;
}
default:
break;
}
char chrDRZData[1024];
int nConnectHeadSize=0;
CFile fConnectFile;
CFileException pfe; if (fConnectFile.Open("HttpConnect.dat",CFile::modeRead|CFile::typeBinary,&pfe))
{
int dwRead=0;
nConnectHeadSize=fConnectFile.GetLength();
while(dwRead<nConnectHeadSize)
{
memset( chrDRZData , 0 ,1024 );
UINT dw=fConnectFile.Read(chrDRZData, 1024);
if (dw==1024)
{
socketClient.Send(chrDRZData,1024,3);
}
else
{
socketClient.Send(chrDRZData,dw,3);
}
dwRead+=dw;
}
fConnectFile.Close(); //g_CurStateCode=1001;//发送成功
//g_CurStateLog="发送数据请求成功,等待服务器反馈!";
}else
{ return HTTP_TRANSFERS_FILE_ERROR_CODE;
}
{
char pszMSG[1024];
int iRet;//
sockaddr_in proxyaddr;//代理服务器地址结构
SOCKET sckClient; //客户端
CClient* pServer=(CClient*)lpVoid;
pServer->OUTPUT(pServer,"Connecting to the proxy.\r\n");
proxyaddr.sin_family = AF_INET;
proxyaddr.sin_port = htons(pServer->m_Info.nPort);//取服务器端口并转化
proxyaddr.sin_addr.s_addr = inet_addr(pServer->m_Info.strProxyAddr);//取服务器地址
sckClient = socket(AF_INET, SOCK_STREAM, 0);
if(sckClient==INVALID_SOCKET) //没有创建成功则给窗口发送消息
{
closesocket(pThreadParam->sckClient);
closesocket(sckClient); //sprintf将错误信息转化为pszMsg。
sprintf(pszMsg, "socket()=INVALID_SOCKET, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
pServer->OUTPUT(pServer,pszMsg);
goto _ThreadExit1;
}
//与代理服务器连接
iRet = connect(sckClient, (const sockaddr*)&proxyaddr, sizeof(proxyaddr));
if(iRet==SOCKET_ERROR)
{
closesocket(pThreadParam->sckClient);
closesocket(sckClient);
sprintf(pszMsg, "connect()=SOCKET_ERROR, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
pServer->OUTPUT(pServer,pszMsg);
}