我使用Wininet来写通过代理服务器访问外网,遇到一个问题
比如我要下载外网的一个文件,通过代理服务器返回状态代码为:200, 但接收数据后发现是一个Html页面,这个页面其实是由代理服务器返回的,并没有真正的访问到外网的文件, 返回的信息用IE打开后是这样的:帐号认证失败 ...
IP 地址: 192.168.1.236
MAC 地址:
服务端时间: 2009-04-24 09:25:14
验证结果: 无效用户.由于状态代码为200(200表示成功),我无法判断这是一个错误,这里应该是要怎么判断才能知道这次的访问是出错的呢?
比如我要下载外网的一个文件,通过代理服务器返回状态代码为:200, 但接收数据后发现是一个Html页面,这个页面其实是由代理服务器返回的,并没有真正的访问到外网的文件, 返回的信息用IE打开后是这样的:帐号认证失败 ...
IP 地址: 192.168.1.236
MAC 地址:
服务端时间: 2009-04-24 09:25:14
验证结果: 无效用户.由于状态代码为200(200表示成功),我无法判断这是一个错误,这里应该是要怎么判断才能知道这次的访问是出错的呢?
解决方案 »
- 怎么用MFC对xml文件进行添加、删除和修改一个节点?
- 问MFC消息入口问题
- html中,IHTMLImgElement接口可以访问image对象,用什么接口访问Applet对象?
- 关于Blog和文档中心,我不会用啊!!
- 两个坐标转换公式根据啥原理得出的?
- 小问题,不明白......
- 关于线程的问题
- 可不可以在单线乘里开2个SOCKET?
- int j = 0; //这个函数结束,调试才能进到自定义void custom消息里?//什么原因
- http get方法返回400 Bad Request原因?
- 有没有系统的介绍ie编程的书籍或者资料 找了好久都没看到 谁能介绍一下 谢谢!
- 多源覆盖问题吧帮我看看呀谢谢了
if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )
{
m_sError = _T("不能连接到代理服务器!");
ClientSock.Close();
return FALSE;
}
char buff[600];
sprintf( buff, "%s%s:%d%s","CONNECT ",GetServerHostName(),GetPort()," HTTP/1.0\r\nUser-Agent: MyApp/0.1\r\n\r\n");
ClientSock.Send(buff,strlen(buff)); //发送请求
memset(buff,0,600);
ClientSock.Receive(buff,600);
if(strstr(buff, "200 Connection established") == NULL) //连接不成功
{
m_sError = _T("通过代理连接主站不成功!");
ClientSock.Close();
return FALSE;
}
而sock5是这样的
1.连接服务器:
2.发送验证方法列表给服务器,进行验证,就算不要密码也需要进行此步
3.发送命令
第二步的命令是:
cnt,method
即发送的byte意义为,验证方法列表,验证方法代码。
一般使用
02(2种验证),00(无验证法),01(user:pwd验证法)
o REP Reply field:
o X'00' succeeded
o X'01' general SOCKS server failure
o X'02' connection not allowed by ruleset
o X'03' Network unreachable
o X'04' Host unreachable
o X'05' Connection refused
o X'06' TTL expired
o X'07' Command not supported
o X'08' Address type not supported
o X'09' to X'FF' unassigned
bool TmSocketS::AuthenticationV5()
{
char SockSCmd[512+10];
SockSCmd[0]=5;
SockSCmd[1]=2; // supports two authentication currently
SockSCmd[2]=0; // NO authentication
SockSCmd[3]=2; // USERNAME/PASSWORD authentication
// The values currently defined for METHOD are:
// o X'00' NO AUTHENTICATION REQUIRED
// x X'01' GSSAPI
// o X'02' USERNAME/PASSWORD
// x X'03' to X'7F' IANA ASSIGNED
// x X'80' to X'FE' RESERVED FOR PRIVATE METHODS
// o X'FF' NO ACCEPTABLE METHODS
TmSocket::Send(SockSCmd,4);
if(TmSocket::Recv(SockSCmd,2)==2)
{
if(SockSCmd[0]==5)
{
switch(SockSCmd[1])
{
case 0:
#ifdef __DEBUG_CSOCKET
printf("SOCKSV5 NO authentication\n");
#endif
return true;
case 2:
{
int szUser=sUser.length();
int szPwd=sPassword.length();
if( (szUser>255)|| (szPwd>255) ||
(szUser<=0) || (szPwd<=0 ) )
{
error = SOCKS5ERR_AUTHFAILED;
return false;
}
SockSCmd[0]=1;
SockSCmd[1]=szUser; ---------------------------用户名
memcpy(SockSCmd+2,sUser.c_str(),szUser);
SockSCmd[2+szUser]=szPwd; ---------------------------密码
memcpy(SockSCmd+3+szUser,sPassword.c_str(),szPwd);
TmSocket::Send(SockSCmd,3+szUser+szPwd);
#ifdef __DEBUG_CSOCKET
printf("Start sockS5 username/password authentication\n");
#endif
if(TmSocket::Recv(SockSCmd,2)==2)
{
if( (SockSCmd[0]==5)&&
(SockSCmd[1]==0) )
{
#ifdef __DEBUG_CSOCKET
printf("Authentication succefully!\n");
#endif
return true;
}
}
#ifdef __DEBUG_CSOCKET
printf("Authentication failed!\n");
#endif
error=SOCKS5ERR_AUTHFAILED;
return false;
}
default:
;
}
}
}
error=SOCKS5ERR_NOAUTHMETH;
return false;
}