在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;
}

解决方案 »

  1.   

    大家帮我看一下WSPConnect函数是不是有问题。。GetProxyConnect函数是可以成功的与代理服务器协商的。。
      

  2.   

    为什么要自己创建socket
    直接用参数那个试试
      

  3.   

    刚才说错了。。如果不自己创建套接字的话IE不会出错。。但
    iRet    =    NextProcTable.lpWSPConnect(s,(SOCKADDR*)&SerAddr,sizeof(SerAddr),lpCallerData,lpCalleeData,lpSQOS,lpGQOS,lpErrno);
    这一句连接不成功。。也就是说不能连接到代理服务器。。
      

  4.   


    那你既然自己建了,就相当于代理跟你的s通讯,而不是应用程序的socket
    所以你应该保存这个s,然后处理spi相关的send,recv操作,用你的s接受数据,然后返回给应用程序
      

  5.   

    谢谢LS的。。我也这样想的。。处理send函数还比较方便。。但recv貌似就比较麻烦了
    有没有办法把我自己创建的s 赋值给上层传进来的s啊。。
      

  6.   

    你应该使用上层传递给你的SOCKET,而不是自己创建一个作为代理,因为上层可能会对SOCKET进行那个设置,这样你这个对应的SOCKET也要做相应的设置以应付上层的应用,这样你要相应实现的函数就多了。你现在唯一的问题是要注意非阻塞的SOCKET,CONNECT的时候就会返回错误,告诉你还没有完成,用SELECT处理一下就好了。