通过代理服务器连接

    技术2022-05-11  99

    BOOL   connectEx(SOCKET   sockConnect,   LPCTSTR   lpszDestIP,   int   nDestPort,   int   nSocksVer   ,   LPCTSTR   lpszProxyIP   ,   int   nProxyPort   )     {     BOOL   bIPTypeIsDomain   =   0;     SOCKADDR_IN   saDest;     saDest.sin_family=   AF_INET;     saDest.sin_port   =   htons((u_short)nDestPort);     saDest.sin_addr.S_un.S_addr   =   inet_addr(lpszDestIP);         if(saDest.sin_addr.S_un.S_addr   ==   0)     {     bIPTypeIsDomain   =   1;     //socks4不支持域名解析     if(nSocksVer   ==   4)     return   0;     }         if(nSocksVer)     {     //代理服务器地址     sockaddr_in   saProxy;     saProxy.sin_family=AF_INET;     saProxy.sin_port=htons(nProxyPort);     saProxy.sin_addr.s_addr=inet_addr(lpszProxyIP);         //连接代理服务器     connect(sockConnect,   (LPSOCKADDR)&saProxy,   sizeof(saProxy));         if(GetLastError()!=0)     return   0;             char   szBuf[1024];     szBuf[1023]=0;         //发送socks命令     szBuf[0]   =   nSocksVer   ;     szBuf[1]   =   1;     szBuf[2]   =   0;     if(sendBlock(sockConnect,   szBuf,   3)   ==0)     {     closesocket(sockConnect);     return   0;     }         int   nRecv   =   0;         nRecv   =   1023;     if(recvBlock(sockConnect,   szBuf,   nRecv)   ==   0)     {     closesocket(sockConnect);     return   0;     }         if(nRecv   ==   0)     {     closesocket(sockConnect);     return   0;     }         if(szBuf[0]   ==   nSocksVer   &&   szBuf[1]   ==   0)     ;     else     {     closesocket(sockConnect);     return   0;     }         //发送socks   connect命令     szBuf[0]   =   nSocksVer;     szBuf[1]   =   1;     szBuf[2]   =   0;         if(bIPTypeIsDomain)//DOMAIN方式     {     szBuf[3]   =   3;     szBuf[4]   =   strlen(lpszDestIP);     strcpy(szBuf+5,   lpszDestIP);     memcpy(szBuf+5+szBuf[4],   &(saDest.sin_port)   ,   2);     }     else//IP4方式     {     szBuf[3]   =   1;     memcpy(szBuf+4,   &(saDest.sin_addr.s_addr),   4);     memcpy(szBuf+8,   &(saDest.sin_port),   2);     }         if(sendBlock(sockConnect,   szBuf,   10)==0)     {     closesocket(sockConnect);     return   0;     };         nRecv   =   10;     if(recvBlock(sockConnect,   szBuf,   nRecv)   ==   0)     {     closesocket(sockConnect);     return   0;     };         if(nRecv   ==   0)     {     closesocket(sockConnect);     return   0;     }             if(szBuf[0]   ==   nSocksVer   &&   szBuf[1]   ==   0)     return   1;     else     return   0;         }     else     {     connect(sockConnect,   (LPSOCKADDR)&saDest,   sizeof(saDest));     if(GetLastError()   ==   0)     return   1;     else     return   0;     }         return   0;     }    

    最新回复(0)