发送数据的时候,检查用户是否使用了代理,没有代理的话,直接发送数据,有代理的话,就取得代理ip和port,然后通过HTTP代理服务器进行数据发送,前面都好写,可是连接代理服务器的代码也写了,怎么还是发送不出去呢?哪位高人有可用的代码可以给小弟发一份吗[email protected]
代码如下:

解决方案 »

  1.   

    void Request::SendString(SOCKET sock,LPCSTR str)
    {
        send(sock,str,strlen(str),0);
    }int Request::SendHTTP(LPCSTR url,LPCSTR headerReceive,BYTE *post,
            DWORD postLength,HTTPRequest *req)
    {
        WSADATA WsaData;
        SOCKADDR_IN sin;
        SOCKET sock;
        char buffer[512];
        char protocol[20],host[256],request[1024];
        int l,port,chars,err;
        MemBuffer headersBuffer,messageBuffer;
    // char headerSend[1024];
    char *headerSend = NULL;    BOOL done;
            ParseURL(url,protocol,sizeof(protocol),host,sizeof(host), // Parse the URL
            request,sizeof(request),&port);
        if(strcmp(protocol,"HTTP"))
            return 1;    err = WSAStartup (0x0101, &WsaData); // Init Winsock
        if(err!=0)
            return 2;    sock = socket (AF_INET, SOCK_STREAM, 0);
        //if (socket == INVALID_SOCKET)
    if (sock == INVALID_SOCKET)
            return 3;    
        sin.sin_family = AF_INET; //Connect to web sever
        sin.sin_port = htons( (unsigned short)port );
        sin.sin_addr.s_addr = GetHostAddress(host);
      

  2.   

    /////////////////////////////////////////////////////////////////////////////////////////
    //如果有代理就先连接代理服务器
    // sin.sin_addr.s_addr = GetHostAddress("220.189.208.188");
    // sin.sin_port = htons( (unsigned short)8080 );

       //改成连接代理服务器
    HKEY hkey = HKEY_CURRENT_USER; 

    LONG result = RegOpenKeyEx(hkey,SUBKEY,0,KEY_READ,&hkey);
    if(result != ERROR_SUCCESS) 
    {
    AfxMessageBox("Open Regkey Error!"); 
    RegCloseKey(hkey);
    return 0; 
    } DWORD dwEn ;
    // DWORD dw ;  
    DWORD type = REG_DWORD;
    DWORD datalen = sizeof(DWORD); //首先读出用户是否使用了代理ProxyEnable == 1使用代理
    //"ProxyEnable"=dword:00000001
    result = RegQueryValueEx(hkey,"ProxyEnable",NULL,&type,(LPBYTE)&dwEn,&datalen); 
    if (result != ERROR_SUCCESS) 
    {
    AfxMessageBox("Read Regkey 'ProxyEnable' Error"); 
    RegCloseKey(hkey);
    return 0;
    } //判断使用代理情况,1使用代理
    if(dwEn != 1)
    {
    RegCloseKey(hkey); if( connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN) ) )
    { return 1;
    }
       
    //printf("\r\n\r\n <<SEND   HTTP   REQUEST  : >> \r\n\r\n");  //Send request

    if( !*request )
    lstrcpyn(request,"/",sizeof(request));

    // 2003. 6. 12. seagate2.//保证postdata可以任意长度,防止用户提交数据过长
    headerSend = (char*)malloc(1024 + postLength);
    memset( headerSend, 0, 1024 + postLength);
    // seagate2 end
    if( post == NULL )
    {
    SendString(sock,"GET ");
    strcpy(headerSend, "GET ");
    }
    else 
    {
    SendString(sock,"POST ");
    strcpy(headerSend, "POST ");
    }
    SendString(sock,request);
    strcat(headerSend, request); SendString(sock," HTTP/1.0\r\n");
    strcat(headerSend, " HTTP/1.0\r\n");

    //以下注释掉的这段发送,仍然可以正常运行,但是否会给某些web server造成影响,未知
    //    SendString(sock,"Accept: image/gif, image/x-xbitmap,"
    //        " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
    //        " application/msword, application/vnd.ms-powerpoint,"
    //        " */*\r\n");
    // strcat(headerSend, "Accept: image/gif, image/x-xbitmap,"
    //        " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
    //        " application/msword, application/vnd.ms-powerpoint,"
    //        " */*\r\n");
    //
    //    SendString(sock,"Accept-Language: en-us\r\n");
    // strcat(headerSend, "Accept-Language: en-us\r\n");
    //
    //    SendString(sock,"Accept-Encoding: gzip, deflate\r\n");
    // strcat(headerSend, "Accept-Encoding: gzip, deflate\r\n");
    //
    //    SendString(sock,"User-Agent: Mozilla/4.0\r\n");
    // strcat(headerSend, "User-Agent: Mozilla/4.0\r\n"); if(postLength)
    {
    wsprintf(buffer,"Content-Length: %ld\r\n",postLength);
    SendString(sock,buffer);
    strcat(headerSend, buffer);
    }
    //SendString(sock,"Cookie: mycookie=blablabla\r\n");
    // printf("Cookie: mycookie=blablabla\r\n");
    SendString(sock,"Host: ");
    strcat(headerSend, "Host: "); SendString(sock,host);
    strcat(headerSend, host); SendString(sock,"\r\n");
    strcat(headerSend, "\r\n");
    /********************************************************
    Usually, an HTTP POST include the header: Content-Type:application/x-www-form-urlencoded Without this header, some web servers (particularly ASP running on IIS)
    will not recognize your parameters
    ********************************************************/
    if( (headerReceive!=NULL) && *headerReceive )
    {
    SendString(sock,headerReceive);
    strcat(headerSend, headerReceive);
    }
        
    SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive
    strcat(headerSend, "\r\n"); if( (post!=NULL) && postLength )
    {
    send(sock,(const char*)post,postLength,0);
    post[postLength] = '\0';

    strcat(headerSend, (const char*)post);
    }
        
    //strcpy(req->headerSend, headerSend);
    req->headerSend = (char*) malloc( sizeof(char*) * strlen(headerSend));
    strcpy(req->headerSend, (char*) headerSend );
    // req->headerSend = (char*) headerSend ;
    // free(req->headerSend);
    // Read the result
    //printf("\r\n\r\n <<RECEIVE   HTTP   REQUEST  : >> \r\n\r\n\r\n"); // First read HTTP headerReceive MemBufferCreate(&headersBuffer );
    chars = 0;
    done = FALSE;
    while(!done)
    {
    l = recv(sock,buffer,1,0);
    if(l<0)
    done=TRUE; switch(*buffer)
    {
    case '\r':
    break;
    case '\n':
    if(chars==0)
    done = TRUE;
    chars=0;
    break;
    default:
    chars++;
    break;
    } MemBufferAddByte(&headersBuffer,*buffer);
    } req->headerReceive = (char*) headersBuffer.buffer;
    *(headersBuffer.position) = 0;    
      

  3.   

    MemBufferCreate(&messageBuffer); // Now read the HTTP body do
    {
    l = recv(sock,buffer,sizeof(buffer)-1,0);
    if(l<0)
    break;
    *(buffer+l)=0;
    MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);
    } while(l>0);
    *messageBuffer.position = 0;
    req->message = (char*) messageBuffer.buffer;
    req->messageLength = (messageBuffer.position - messageBuffer.buffer);
    /////////////////////////////////////////////////////////////////////////////////////////
    }
    else
    {
    char headerSend[1024]; BYTE data[100];  
    DWORD types = REG_SZ;
    DWORD datalens = sizeof(data); //"ProxyServer"="220.189.208.188:8080"
    result = RegQueryValueEx(hkey,"ProxyServer",NULL,&types,(LPBYTE)&data,&datalens); 
    if (result != ERROR_SUCCESS) 
    {
    AfxMessageBox("Read Regkey 'ProxyServer' Error"); 
    RegCloseKey(hkey);
    return 0 ;
    } RegCloseKey(hkey);  //得到代理服务器ip和port
    CString strtemp ;
    CString strtemp1,strtemp2;
    strtemp = data;
    int i = strtemp.Find(":");
    if (i == 0)
    {
    AfxMessageBox("can't get ':'");//"can't get key words"
    }
    else
    strtemp1 = strtemp.Mid(0,14); strtemp2 = strtemp.Mid(15,strtemp.GetLength());
    sin.sin_addr.s_addr = GetHostAddress(strtemp1);
    sin.sin_port = htons( (unsigned short)atoi(strtemp2)) ;   //改成连接代理服务器
        if( SOCKET_ERROR == connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN)))
    {
            return 4;
    }    if( !*request )
            lstrcpyn(request,"/",sizeof(request));

        if( post == NULL )
    {
    sprintf(headerSend, "GET http://%s",host);
            SendString(sock,headerSend);
    }
        else 
    {
    sprintf(headerSend, "POST http://%s",host);
    SendString(sock,headerSend);
    }    SendString(sock,request);
    strcat(headerSend, request);    SendString(sock," HTTP/1.0\r\n");
    strcat(headerSend, " HTTP/1.0\r\n");    SendString(sock,"Content-Type: application/x-www-form-urlencoded\r\n");
    strcat(headerSend, "Content-Type: application/x-www-form-urlencoded\r\n");    SendString(sock,"User-Agent: Mozilla/4.0\r\n");
    strcat(headerSend, "User-Agent: Mozilla/4.0\r\n");    SendString(sock,"Host: ");
    strcat(headerSend, "Host: ");    SendString(sock,host);
    strcat(headerSend, host);    SendString(sock,"\r\n");
    strcat(headerSend, "\r\n");    if( (headerReceive!=NULL) && *headerReceive )
    {
            SendString(sock,headerReceive);
    strcat(headerSend, headerReceive);
    }
        
        SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive
    strcat(headerSend, "\r\n");    if( (post!=NULL) && postLength )
    {
            send(sock,(const char*)post,postLength,0);
    post[postLength] = '\0';

    strcat(headerSend, (const char*)post);
    }
        
    //strcpy(req->headerSend, headerSend);
    req->headerSend = (char*) malloc( sizeof(char*) * strlen(headerSend));
    strcpy(req->headerSend, (char*) headerSend );
    // req->headerSend = (char*) headerSend ;
    // free(req->headerSend);
        MemBufferCreate(&headersBuffer );
        chars = 0;
        done = FALSE;    while(!done)
        {
            l = recv(sock,buffer,1,0);
            if(l<0)
                done=TRUE;        switch(*buffer)
            {
                case '\r':
                    break;
                case '\n':
                    if(chars==0)
                        done = TRUE;
                    chars=0;
                    break;
                default:
                    chars++;
                    break;
            }        MemBufferAddByte(&headersBuffer,*buffer);
        }    req->headerReceive = (char*) headersBuffer.buffer;
        *(headersBuffer.position) = 0;      MemBufferCreate(&messageBuffer); // Now read the HTTP body    do
        {
            l = recv(sock,buffer,sizeof(buffer)-1,0);
            if(l<0)
                break;
            *(buffer+l)=0;
            MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);
        } while(l>0);
        *messageBuffer.position = 0;
        req->message = (char*) messageBuffer.buffer;
        req->messageLength = (messageBuffer.position - messageBuffer.buffer); }    closesocket(sock);
        return 0;
    }