在SPI中的WSPConnect函数中重定向地址,使它先连接到代理服务器,其中与代理服务器的协商已经完成了。。但是打不开网页。。有这方面经验的指点一下吧。。比较急。。代码如下
BOOL GetProxyConnect(SOCKET s,
const sockaddr_in SerAddr,
const sockaddr_in DestAddr,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
LPINT lpErrno ,
CString strUserName /* = */,
CString strPassWord /* = */ )
{
int iRet,iLen;
TCHAR szBuf[512];
// iRet = NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),NULL,NULL,NULL,NULL,NULL);
iRet = NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("Connect to Proxy Server failed\n"));
return FALSE;
}
memset(szBuf,0,512);
szBuf[0] = 5;
szBuf[1] = 2;
szBuf[2] = 0;
szBuf[3] = 2; PrintRecv(szBuf);
iLen = send(s,szBuf,4,0);
if (4 != iLen)
{
OutputDebugString(_T("Send Data To Proxy Server fail\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
memset(szBuf,0,512);
PrintRecv(szBuf);
iLen = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iLen)
{
OutputDebugString(_T("Recv Data from proxy server faile\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
} if (5 != szBuf[0])
{
OutputDebugString(_T("Error version\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
switch (szBuf[1])
{
case 0:
OutputDebugString(_T("Don't need to validate\n"));
break;
case 2:
OutputDebugString(_T("Need validate U/P\n"));
OutputDebugString(_T("Begin validate U/P\n"));
memset(szBuf,0,512);
iLen = strUserName.GetLength();
szBuf[0] = 1;
szBuf[1] = iLen;
memcpy((szBuf + 2),strUserName.GetBuffer(0),szBuf[1]);
szBuf[2 + iLen] = strPassWord.GetLength();
memcpy((szBuf + 3 + iLen),strPassWord.GetBuffer(0),strPassWord.GetLength());
PrintRecv(szBuf); PrintRecv(szBuf);
iRet = send(s,szBuf,3 + iLen + strPassWord.GetLength(),0);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("Send validate data failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
memset(szBuf,0,512);
PrintRecv(szBuf);
iRet = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("recv validate data failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (0 != szBuf[1])
{
OutputDebugString(_T("U/W error\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
OutputDebugString(_T("Validate success\n"));
break;
default:
OutputDebugString(_T("Don't support validate mode\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
break;
}
memset(szBuf,0,512);
szBuf[0] = 5;
szBuf[1] = 1;
szBuf[2] = 0;
szBuf[3] = 1;
*((int *)(&szBuf[4])) = DestAddr.sin_addr.s_addr;
*((short *)(&(szBuf[8]))) = (short)DestAddr.sin_port; PrintRecv(szBuf);
iRet = send(s,szBuf,10,0);
if (10 != iRet)
{
OutputDebugString(_T("Send Connect Info failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
} memset(szBuf,0,512);
PrintRecv(szBuf);
iRet = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("recv connect info failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (5 != szBuf[0])
{
OutputDebugString(_T("error version\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (0 != szBuf[1])
{
OutputDebugString(_T("Connect to DestServer failed\n"));
shutdown(s,2);
closesocket(s);
switch (szBuf[1])
{
case 1:
OutputDebugString("general SOCKS server failure ");
break;
case 2:
OutputDebugString("connection not allowed by ruleset ");
break;
case 3:
OutputDebugString("Network unreachable ");
break;
case 4:
OutputDebugString("Host unreachable ");
break;
case 5:
OutputDebugString("Connection refused ");
break;
case 6:
OutputDebugString("TTL expired ");
break;
case 7:
OutputDebugString("Command not supported ");
break;
case 8:
OutputDebugString("Address type not supported ");
break;
case 9:
OutputDebugString(" to X\'FF\' unassigned ");
break;
default:
OutputDebugString(" Unknow error ");
break;
}
return FALSE;
}
return TRUE;
}
int WSPAPI WSPConnect(
SOCKET s,
const struct sockaddr FAR * name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
LPINT lpErrno
)
{
TCHAR szAppName[MAX_PATH];
GetModuleFileName(NULL,szAppName,MAX_PATH);
OutputDebugString(_T("WSPConnect..."));
OutputDebugString(szAppName); /*if (strcmp(szAppName,"C:\\Program Files\\Internet Explorer\\iexplore.exe") != 0)
{
OutputDebugString(_T("pass"));
return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}*/ sockaddr_in addr,addr1;
// ss = socket(AF_INET,SOCK_STREAM,0);
s = socket(AF_INET,SOCK_STREAM,0);
if (INVALID_SOCKET == s)
{
OutputDebugString(_T("Socet init failed\n"));
return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("203.116.173.132");
addr.sin_port = htons(3370);
memcpy((SOCKADDR*)&addr1,name,sizeof(SOCKADDR));
if(GetProxyConnect(s,addr,addr1,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno,"gpicn","ggg"))
{
return 0;
}
else
{
OutputDebugString(_T("Connect faile\n"));
return SOCKET_ERROR;
// return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}
return 0;
}
BOOL GetProxyConnect(SOCKET s,
const sockaddr_in SerAddr,
const sockaddr_in DestAddr,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
LPINT lpErrno ,
CString strUserName /* = */,
CString strPassWord /* = */ )
{
int iRet,iLen;
TCHAR szBuf[512];
// iRet = NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),NULL,NULL,NULL,NULL,NULL);
iRet = NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("Connect to Proxy Server failed\n"));
return FALSE;
}
memset(szBuf,0,512);
szBuf[0] = 5;
szBuf[1] = 2;
szBuf[2] = 0;
szBuf[3] = 2; PrintRecv(szBuf);
iLen = send(s,szBuf,4,0);
if (4 != iLen)
{
OutputDebugString(_T("Send Data To Proxy Server fail\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
memset(szBuf,0,512);
PrintRecv(szBuf);
iLen = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iLen)
{
OutputDebugString(_T("Recv Data from proxy server faile\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
} if (5 != szBuf[0])
{
OutputDebugString(_T("Error version\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
switch (szBuf[1])
{
case 0:
OutputDebugString(_T("Don't need to validate\n"));
break;
case 2:
OutputDebugString(_T("Need validate U/P\n"));
OutputDebugString(_T("Begin validate U/P\n"));
memset(szBuf,0,512);
iLen = strUserName.GetLength();
szBuf[0] = 1;
szBuf[1] = iLen;
memcpy((szBuf + 2),strUserName.GetBuffer(0),szBuf[1]);
szBuf[2 + iLen] = strPassWord.GetLength();
memcpy((szBuf + 3 + iLen),strPassWord.GetBuffer(0),strPassWord.GetLength());
PrintRecv(szBuf); PrintRecv(szBuf);
iRet = send(s,szBuf,3 + iLen + strPassWord.GetLength(),0);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("Send validate data failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
memset(szBuf,0,512);
PrintRecv(szBuf);
iRet = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("recv validate data failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (0 != szBuf[1])
{
OutputDebugString(_T("U/W error\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
OutputDebugString(_T("Validate success\n"));
break;
default:
OutputDebugString(_T("Don't support validate mode\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
break;
}
memset(szBuf,0,512);
szBuf[0] = 5;
szBuf[1] = 1;
szBuf[2] = 0;
szBuf[3] = 1;
*((int *)(&szBuf[4])) = DestAddr.sin_addr.s_addr;
*((short *)(&(szBuf[8]))) = (short)DestAddr.sin_port; PrintRecv(szBuf);
iRet = send(s,szBuf,10,0);
if (10 != iRet)
{
OutputDebugString(_T("Send Connect Info failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
} memset(szBuf,0,512);
PrintRecv(szBuf);
iRet = recv(s,szBuf,512,0);
PrintRecv(szBuf);
if (SOCKET_ERROR == iRet)
{
OutputDebugString(_T("recv connect info failed\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (5 != szBuf[0])
{
OutputDebugString(_T("error version\n"));
shutdown(s,2);
closesocket(s);
return FALSE;
}
if (0 != szBuf[1])
{
OutputDebugString(_T("Connect to DestServer failed\n"));
shutdown(s,2);
closesocket(s);
switch (szBuf[1])
{
case 1:
OutputDebugString("general SOCKS server failure ");
break;
case 2:
OutputDebugString("connection not allowed by ruleset ");
break;
case 3:
OutputDebugString("Network unreachable ");
break;
case 4:
OutputDebugString("Host unreachable ");
break;
case 5:
OutputDebugString("Connection refused ");
break;
case 6:
OutputDebugString("TTL expired ");
break;
case 7:
OutputDebugString("Command not supported ");
break;
case 8:
OutputDebugString("Address type not supported ");
break;
case 9:
OutputDebugString(" to X\'FF\' unassigned ");
break;
default:
OutputDebugString(" Unknow error ");
break;
}
return FALSE;
}
return TRUE;
}
int WSPAPI WSPConnect(
SOCKET s,
const struct sockaddr FAR * name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
LPINT lpErrno
)
{
TCHAR szAppName[MAX_PATH];
GetModuleFileName(NULL,szAppName,MAX_PATH);
OutputDebugString(_T("WSPConnect..."));
OutputDebugString(szAppName); /*if (strcmp(szAppName,"C:\\Program Files\\Internet Explorer\\iexplore.exe") != 0)
{
OutputDebugString(_T("pass"));
return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}*/ sockaddr_in addr,addr1;
// ss = socket(AF_INET,SOCK_STREAM,0);
s = socket(AF_INET,SOCK_STREAM,0);
if (INVALID_SOCKET == s)
{
OutputDebugString(_T("Socet init failed\n"));
return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("203.116.173.132");
addr.sin_port = htons(3370);
memcpy((SOCKADDR*)&addr1,name,sizeof(SOCKADDR));
if(GetProxyConnect(s,addr,addr1,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno,"gpicn","ggg"))
{
return 0;
}
else
{
OutputDebugString(_T("Connect faile\n"));
return SOCKET_ERROR;
// return NextProcTable.lpWSPConnect(s,name,namelen,lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
}
return 0;
}
解决方案 »
- VC2005中的命令窗口中能否执行DOS命令?该如何设置??
- 如何将SrcmenDC内的图片另存为BMP格式图片!
- 如何制作一个保密文件夹?
- 我用directshow写了一个播放器,但在某台电脑上不支持*.rm文件(其他播放器支持播放),怎么办呢?
- 吐血求教!散分开路,有关ATL问题!在线等待!!!!!!!!!!!
- 有谁用过vc7.0,用过的朋友跟我讲讲ON_COMMAND_RANGE宏怎么用?
- 求救,一个关于创建状态栏的莫名其妙的错误
- 利用WinSock进行有连接的通信时候,如何如同QQ一样能够接收对方发过的消息?
- 如何实现当鼠标在VIEW上移动时,移动到哪儿,哪儿就发亮,有类似3D效果!
- F6=1/4?
- 我创建一个新的进程,想杀掉另一个进程中的一个线程,该怎么找到我想关掉的线程啊?然后又怎么再恢复这个线程呢?
- 关于画刷的菜鸟问题
直接用参数那个试试
iRet = NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
这一句连接不成功。。也就是说不能连接到代理服务器。。
那你既然自己建了,就相当于代理跟你的s通讯,而不是应用程序的socket
所以你应该保存这个s,然后处理spi相关的send,recv操作,用你的s接受数据,然后返回给应用程序
有没有办法把我自己创建的s 赋值给上层传进来的s啊。。