求代码,最好可立即运行.
解决方案 »
- VC6开发的OCX拖到ATL的窗口上这个窗口就show 不出来了!把OCX拿走就能show出来,这是为什么呢?
- 【请教高手】编制软件中常见却不简单的问题!!!!!
- 刚刚学习VC,编串口调试助手,可是在执行到safearray_inp=variant_inp; 时就出错,轻各位高手指点!
- ATL控件如何得到网页表单中输入的值?
- 我用Ras异步方式拨号后,怎样得到当前的拨号状态呢?
- 关于网络的怪问题!
- plc与wincc通信
- ADO访问数据库问题!大牛请教!!
- 关于Radius认证服务客户端程序打包的基础问题(Visual C++贴)
- 关于HBITMAP
- 复选框问题!
- 初学MFC,请教大虾们一个new form的问题。
直接用socket的API进行下载
A.先连接上http代理,以下是连接和验证http/socks代理的代码static void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
{
const char base64digits[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (; inlen >= 3; inlen -= 3)
{
*out++ = base64digits[in[0] >> 2];
*out++ = base64digits[((in[0] < < 4) & 0x30) | (in[1] >> 4)];
*out++ = base64digits[((in[1] < < 2) & 0x3c) | (in[2] >> 6)];
*out++ = base64digits[in[2] & 0x3f];
in += 3;
}
if (inlen > 0)
{
unsigned char fragment; *out++ = base64digits[in[0] >> 2];
fragment = (in[0] < < 4) & 0x30;
if (inlen > 1)
fragment |= in[1] >> 4;
*out++ = base64digits[fragment];
*out++ = (inlen < 2) ? '=' : base64digits[(in[1] < < 2) & 0x3c];
*out++ = '=';
}
*out = '\0';
}; //-- connect proxy
BOOL ConnectEx(SOCKET sock, const char *lpszDestHost, int nDestPort, const char * lpszProxyAddress, const int nProxyPort, const char * lpszProxyProtocol, BOOL bNeedAuth, const char * lpszUserName, const char * lpszPassword)
{
//connect to proxy
char szBuffer[1024 + 1] = {""};
int nLen = 0; SOCKADDR_IN saProxy;
saProxy.sin_family = AF_INET;
saProxy.sin_port = nProxyPort;
saProxy.sin_addr.S_un.S_addr= inet_addr(lpszProxyAddress);
if (saProxy.sin_addr.S_un.S_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszProxyAddress);
if (lphost != NULL)
saProxy.sin_addr.S_un.S_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
return 0;
}
} if(connect(sock, (SOCKADDR*)&saProxy, sizeof(SOCKADDR)))
{
return 0;
} if(stricmp(lpszProxyProtocol, "HTTPS") == 0 || stricmp(lpszProxyProtocol, "HTTP") == 0 )
{
if(bNeedAuth)
{
//Proxy-Authorization: Basic
char szAuth[1024 + 1] = {""};
char szAuthT[1024 + 1] = {""};
sprintf(szAuthT, "%s:%s", lpszUserName,lpszPassword);
to64frombits((UCHAR *)szAuth, (UCHAR *)szAuthT, strlen(szAuthT));
sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: Basic %s\r\n\r\n", lpszDestHost, nDestPort, szAuth);
}
else
{
sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\n\r\n", lpszDestHost, nDestPort);
} nLen = strlen(szBuffer);
send(sock, szBuffer, nLen, 0);
nLen = 1024;
recv(sock, szBuffer, nLen, 0);
if(strnicmp(szBuffer, "HTTP/1.0 200", strlen("HTTP/1.0 200")) == 0 ||
strnicmp(szBuffer, "HTTP/1.1 200", strlen("HTTP/1.1 200")) == 0)
{
return 1;
}
return 0;
} if(stricmp(lpszProxyProtocol, "SOCKS5") == 0)
{
//auth
nLen = 0;
if(bNeedAuth)
{
szBuffer[0] = 5;
szBuffer[1] = 2;
szBuffer[2] = 0;
szBuffer[3] = 2;
nLen = 4;
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] == 5)
{
//need auth
if(szBuffer[1] == 2)
{
szBuffer[0] = 1;
nLen = strlen(lpszUserName);
szBuffer[1] = nLen;
strcpy(szBuffer+2, lpszUserName);
nLen += 2;
szBuffer[nLen] = strlen(lpszPassword);
strcpy(szBuffer+nLen+1, lpszPassword);
nLen = nLen + 1 + strlen(lpszPassword);
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[1] != 0)
{
return 0;
}
}
else
{
if(szBuffer[1] != 0)
{
return 0;
}
}
}
else
return 0; }
else
{
szBuffer[0] = 5;
szBuffer[1] = 1;
szBuffer[2] = 0;
nLen = 3;
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] != 5 || szBuffer[1] != 0)
{
return 0;
}
}
//translate DestAddr
szBuffer[0] = 5;
szBuffer[1] = 1;
szBuffer[2] = 0;
szBuffer[3] = 3;//DOMAIN
szBuffer[4] = strlen(lpszDestHost);//domain len
strcpy(szBuffer+5, lpszDestHost);
unsigned short uPort = htons(nDestPort);
memcpy(szBuffer+5+strlen(lpszDestHost), &uPort, 2);
nLen = 5 + strlen(lpszDestHost) + 2;
send(sock, szBuffer, nLen, 0);
nLen = 10;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] != 5 || szBuffer[1] != 0)
{
return 0;
}
return 1;
}
return 0;
} B.然后通过代理连上ftp,然后所有步骤你可以看用一般ftp客户端如何验证和下载文件的.上面方法比较繁锁.
1.先将代理设置进IE,以下代码设置代理到IE
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
{
//conn_name: active connection name.
//proxy_full_addr : eg "210.78.22.87:8000"
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill out list struct.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = conn_name;
// Set three options.
list.dwOptionCount = 3;
list.pOptions = new INTERNET_PER_CONN_OPTION[3];
// Make sure the memory was allocated.
if(NULL == list.pOptions)
{
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
list.pOptions[1].Value.pszValue = proxy_full_addr;
// Set proxy override.
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
list.pOptions[2].Value.pszValue = "local";
// Set the options on the connection.
bReturn = InternetSetOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory.
delete [] list.pOptions;
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
return bReturn;
}2.InternetOpen("FTP", INTERNET_OPEN_TYPE_PROXY
,"TestProxy",NULL, 0);3.InternetConnect(.........)4.InternetReadFile(......)5.WriteFile(.........)这种方法远比第一种方法简单.思路已经给出了,部分代码也有了,自己要写出来,也不是什么难事.