求基于对话框的源代码,就是象花刺代理一样的,可以连接远程服务器,能简单的设置代理WEB站点的IP、端口。设置的代理WEB站点的IP、端口能在IE的Internet选项里看出,急呀 !!!

解决方案 »

  1.   


    // 通用型的程序代码片段:sock4,sock5,http1.1.我使用CblockingSock进行socket传输.你可以改成你自己用的如Csocket.
    struct sock4req1
    {
    char VN;
    char CD;
    unsigned short Port;
    unsigned long IPAddr;
    char other[1];
    };struct sock4ans1
    {
    char VN;
    char CD;
    };struct sock5req1
    {
    char Ver;
    char nMethods;
    char Methods[255];
    };struct sock5ans1
    {
    char Ver;
    char Method;
    };struct sock5req2
    {
    char Ver;
    char Cmd;
    char Rsv;
    char Atyp;
    char other[1];
    };struct sock5ans2
    {
    char Ver;
    char Rep;
    char Rsv;
    char Atyp;
    char other[1];
    };struct authreq
    {
    char Ver;
    char Ulen;
    char Name[3];
    char PLen;
    char Pass[3];
    };struct authans
    {
    char Ver;
    char Status;
    };
    CBlockingSocket socketServer,socketClient,socketProxy;
    socketClient.Create();
    char* buffer = new char[50000];
    try {
    //判断代理类型,使用各种代理的处理
    char buff[600];
    switch(m_nProxyType) 
    {
    case PROXYTYPE_NOPROXY:
    //不使用代理直接连接
    {
    saServer = CBlockingSocket::GetHostByName(m_strServerName, m_nPort);
    socketClient.Connect(saServer);
    break;
    }
    case PROXYTYPE_SOCK4:
    {
    saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
    socketClient.Connect(saServer);
    memset(buff,0,600);
    struct sock4req1 *m_proxyreq;
    m_proxyreq = (struct sock4req1 *)buff;
    m_proxyreq->VN = 4;
    m_proxyreq->CD = 1;
    m_proxyreq->Port = ntohs(m_nPort);
    m_proxyreq->IPAddr = inet_addr(m_strServerName);
    socketClient.Send(buff,9,0);
    struct sock4ans1 *m_proxyans;
    m_proxyans = (struct sock4ans1 *)buff;
    memset(buff,0,600);
    socketClient.Receive(buff,600,10);
    if(m_proxyans->VN != 0 || m_proxyans->CD != 90)
    {
    //g_CurStateCode=-6002;
    //g_CurStateLog="通过代理连接主站不成功!";
    socketClient.Close();
    return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
    }
    break;
    }
    case PROXYTYPE_SOCK4A:
    {
    saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
    socketClient.Connect(saServer);
    memset(buff,0,600);
    struct sock4req1 *m_proxyreq;
    m_proxyreq = (struct sock4req1 *)buff;
    m_proxyreq->VN = 4;
    m_proxyreq->CD = 1;
    m_proxyreq->Port = ntohs(m_nPort);
    m_proxyreq->IPAddr = inet_addr(m_strServerName);
    socketClient.Send(buff,9,0);
    struct sock4ans1 *m_proxyans;
    m_proxyans = (struct sock4ans1 *)buff;
    memset(buff,0,600);
    socketClient.Receive(buff,600,10);
    if(m_proxyans->VN != 0 || m_proxyans->CD != 90)
    {
    //g_CurStateCode=-6002;
    //g_CurStateLog="通过代理连接主站不成功!";
    socketClient.Close();
    return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
    }
    break;
    }
      

  2.   

    //使用SOCK5代理服务器连接
    case PROXYTYPE_SOCK5:
    {
    saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
    socketClient.Connect(saServer);
    struct sock5req1 *m_proxyreq1;
    m_proxyreq1 = (struct sock5req1 *)buff;
    memset(m_proxyreq1,0,sizeof(m_proxyreq1));
    if (m_bUseProxyLogin)
    {
    m_proxyreq1->Ver = 5;
    m_proxyreq1->nMethods = 1;
    m_proxyreq1->Methods[0] = 2;
    }
    else
    {
    m_proxyreq1->Ver = 5;
    m_proxyreq1->nMethods = 1;
    m_proxyreq1->Methods[0] = 0;
    }
    socketClient.Send(buff,3,0);
    struct sock5ans1 *m_proxyans1;
    m_proxyans1 = (struct sock5ans1 *)buff; unsigned long tmpLong1 = inet_addr(m_strServerName);
    unsigned short port1 = ntohs(m_nPort); memset(buff,0,600);
    socketClient.Receive(buff,600,10); if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2))
    {
    socketClient.Close();
    delete [] buffer;
    return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
    }
    if(m_proxyans1->Method == 2)
    {
    int nUserLen = strlen(m_strProxyUser);
    int nPassLen = strlen(m_strProxyPwd);
    struct authreq *m_authreq;
    m_authreq = (struct authreq *)buff;
    memset(m_authreq,0,sizeof(m_authreq));
    m_authreq->Ver = 1;
    m_authreq->Ulen = nUserLen;
    strcpy(m_authreq->Name,m_strProxyUser);
    m_authreq->PLen = nPassLen;
    strcpy(m_authreq->Pass,m_strProxyPwd);
    int s1=sizeof(authreq);
    //socketClient.Receive(buff,sizeof(authans),60);
    socketClient.Send(buff,sizeof(authreq),0);
    struct authans *m_authans;
    m_authans = (struct authans *)buff;
    memset(buff,0,600);
    int recvResult=socketClient.Receive(buff,sizeof(authans),60);
    if(m_authans->Ver != 1 || m_authans->Status != 0)
    {
    socketClient.Close();
    delete [] buffer;
    return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
    }
    }
    struct sock5req2 *m_proxyreq2;
    m_proxyreq2 = (struct sock5req2 *)buff;
    m_proxyreq2->Ver = 5;
    m_proxyreq2->Cmd = 1;
    m_proxyreq2->Rsv = 0;
    m_proxyreq2->Atyp = 1;
    unsigned long tmpLong = inet_addr(m_strServerName);
    unsigned short port = ntohs(m_nPort);
    memcpy(m_proxyreq2->other,&tmpLong,4);
    memcpy(m_proxyreq2->other+4,&port,2);
    socketClient.Send(buff,sizeof(struct sock5req2)+5,0);
    struct sock5ans2 *m_proxyans2;
    memset(buff,0,600);
    m_proxyans2 = (struct sock5ans2 *)buff;
    int nResult1=socketClient.Receive(buff,600,10);
    if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0)
    {
    //g_CurStateCode=-6004;
    //g_CurStateLog="通过代理连接主站不成功!";
    socketClient.Close();
    delete [] buffer;
    return HTTP_TRANSFERS_PROXYCONNECT_ERROR_CODE;
    }
    break;
    }
      

  3.   

    case PROXYTYPE_HTTP11:
    {
    saServer = CBlockingSocket::GetHostByName(m_strProxyServerName, m_nProxyPort);
    socketClient.Connect(saServer);
    CString str="",str1="";
    if (!m_bUseProxyLogin)
    {
    str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort,
    m_strServerName,m_nPort);
    str1="Accept: */*\r\n"
    "Content-Type: text/html\r\n"
    "Proxy-Connection: Keep-Alive\r\n"
    "Content-length: 0\r\n\r\n";
    str+=str1;
    }
    else
    {
    str.Format("CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",m_strServerName,m_nPort,
    m_strServerName,m_nPort);
    str1="Accept: */*\r\n"
    "Content-Type: text/html\r\n"
    "Proxy-Connection: Keep-Alive\r\n"
    "Content-length: 0\r\n";
    str+=str1;
    CString userpass;
    CString base64str;
    if (!m_strProxyDomain.IsEmpty())
    {
    userpass.Format("%s:%s",m_strProxyDomain+"\\"+m_strProxyUser,m_strProxyPwd);
    }
    else
    {
    userpass.Format("%s:%s",m_strProxyUser,m_strProxyPwd);
    }
    char chrBase64[4096];
    EncodeBase64(userpass.GetBuffer(userpass.GetLength()),chrBase64,userpass.GetLength(),userpass.GetLength()*3);
    base64str=chrBase64;
    str+="Authorization: Basic "+base64str+"\r\n";
    str+="Proxy-Authorization: Basic "+base64str+"\r\n";
    if (!m_strProxyDomain.IsEmpty())
    {
    CString strrealmDomain;
    strrealmDomain.Format("WWW-Authenticate: Negotiate\r\nWWW-Authenticate: NTLM\r\nWWW-Authenticate: Basic realm=%s\r\n",m_strProxyDomain);
    str+=strrealmDomain;
    }
    }
    str+="\r\n";
    int numsent=socketClient.Send(str,str.GetLength(),0);
    CString strResultBuffer="";
    while (1) {
    int nProxyresult=socketClient.Receive(buff,600,60);
    strResultBuffer+=buff;
    if (nProxyresult==-1 || nProxyresult==0 || nProxyresult<600) break;
    }
    if(strResultBuffer.Find("HTTP/1.0 200")==-1) //连接不成功
    {
    CFile cfile;
    cfile.Open("HttpProxyRev.LOG",CFile::modeCreate|CFile::modeWrite);
    cfile.Write(buff,600);
    cfile.Close();
    socketClient.Close();
    return -6004;
    }
    break;
    }
    default:
    break;
    }
    char chrDRZData[1024];
    int nConnectHeadSize=0;
    CFile fConnectFile;
    CFileException pfe; if (fConnectFile.Open("HttpConnect.dat",CFile::modeRead|CFile::typeBinary,&pfe))
    {
    int dwRead=0;
    nConnectHeadSize=fConnectFile.GetLength();
    while(dwRead<nConnectHeadSize)
    {
    memset( chrDRZData , 0 ,1024 );
    UINT dw=fConnectFile.Read(chrDRZData, 1024);
    if (dw==1024) 
    {
    socketClient.Send(chrDRZData,1024,3);
    }
    else
    {
    socketClient.Send(chrDRZData,dw,3);
    }
    dwRead+=dw;
    }
    fConnectFile.Close(); //g_CurStateCode=1001;//发送成功
    //g_CurStateLog="发送数据请求成功,等待服务器反馈!";
    }else 
    { return HTTP_TRANSFERS_FILE_ERROR_CODE;
    }
      

  4.   

    这是我在网上找的代码,不知下面该怎么写:
    {
             char pszMSG[1024];
    int iRet;//
    sockaddr_in proxyaddr;//代理服务器地址结构
    SOCKET sckClient; //客户端
    CClient* pServer=(CClient*)lpVoid;

    pServer->OUTPUT(pServer,"Connecting to the proxy.\r\n");

    proxyaddr.sin_family = AF_INET;
    proxyaddr.sin_port = htons(pServer->m_Info.nPort);//取服务器端口并转化
    proxyaddr.sin_addr.s_addr = inet_addr(pServer->m_Info.strProxyAddr);//取服务器地址
     
    sckClient = socket(AF_INET, SOCK_STREAM, 0);
    if(sckClient==INVALID_SOCKET) //没有创建成功则给窗口发送消息
    {
    closesocket(pThreadParam->sckClient);
    closesocket(sckClient);  //sprintf将错误信息转化为pszMsg。
    sprintf(pszMsg, "socket()=INVALID_SOCKET, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
    pServer->OUTPUT(pServer,pszMsg);
    goto _ThreadExit1;
    }
    //与代理服务器连接
    iRet = connect(sckClient, (const sockaddr*)&proxyaddr, sizeof(proxyaddr));
    if(iRet==SOCKET_ERROR)
    {
    closesocket(pThreadParam->sckClient);
    closesocket(sckClient);
    sprintf(pszMsg, "connect()=SOCKET_ERROR, WSAGetLastError()=%d\r\nListening Thread terminated.\r\n", WSAGetLastError());
    pServer->OUTPUT(pServer,pszMsg);
     
    }
      

  5.   

    http代理最简单了,get里面写目标url的完整而不是相对路径就可以了,还有,别忘记设置host为目标url的host