2012-05-14 5 views
1

원격 서버에서 데이터를 수신하는 데 문제가 있습니다. http://www.google.com과 같은 호스트에 HTTP 요청을 보낼 수 있지만 회신을받을 수없는 것 같습니다. 나는 그런으로 포맷 된 HTTP 1.0 요청을 호스트를 보내고있다 :원격 서버에서 데이터 수신

GET/HTTP/1.0
호스트 : www.google.com
연결 : 여기에 가까운

가있는 부분이다 프록시 번호 :

//Parse Request Buffer 
    HttpRequest req; 
    req.ParseRequest(request.c_str(), request.length()); 

    //Format Data to be Sent: 
    req.AddHeader ("Connection", "close"); // add connection close headers 
    req.SetVersion ("1.0");     // set http 1.0 flag 
    char *requestBuf = new char [req.GetTotalLength()]; 
    req.FormatRequest(requestBuf); 

    //Get host IP by name 
    struct hostent *host; 
    host = gethostbyname(req.GetHost().c_str()); 

    //Setup remote address structure 
    struct sockaddr_in remoteAddr; 
    remoteAddr.sin_family = AF_INET;  
    remoteAddr.sin_port = htons(req.GetPort()); 
    remoteAddr.sin_addr = *((struct in_addr *)host->h_addr); 

    //create new socket for remote server 
    int remoteSock = socket(AF_INET, SOCK_STREAM, 0); 
    if(remoteSock < 0) 
    { 
      perror("Socket Error"); 
      //return -1; 
    } 

    //connecting to remote server 
    if(connect(remoteSock, (struct sockaddr *)&remoteAddr, sizeof(remoteAddr)) < 0) 
    { 
      perror("Connect Error"); 
      //return -1; 
    } 

    cout.flush() << requestBuf << endl; 
    //send request to remote server 
    if(send(remoteSock, requestBuf, sizeof(requestBuf), 0) < 0) 
    { 
      perror("Write Error"); 
      //return -1; 
    } 

    //receive reply from server 
    char *recBuf = new char [1024]; 
    int bufSize = 1024; 
    int readSize; 

    while(1) 
    { 
      readSize = read(remoteSock, recBuf, bufSize); //Read from Remote Server 
      cout.flush() << recBuf << endl; 
      if(readSize <= 0)  //If the requestBuf not filled, nothing left to send to client 
        break; 
      write(clientSock, recBuf, readSize);   //write reply to Client 

    } 

    close(remoteSock); 


cout.flush()의 recBuf 아무것도 출력하지 않는다.
무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까? 이 코드에서

+0

(1) 결과를 기록하기 전에 읽기 오류 ('if (readsize <= 0)')를 확인해야합니다. (2)'requestBuf'를 설정하는 코드를 보여주십시오. 특히 sizeof (requestBuf)를 사용하면 요청이 버퍼 전체를 차지하지 않기 때문에 매우 의심스러워 보입니다. (3)'recBuf'는 NUL로 종료되지 않으므로'cUt.flush() << recBuf << endl;'줄 에서처럼 recBuf를 다루지 않아야합니다. – Celada

+0

제안 (1)이 포함되었습니다. requestBuf가 설정되는 방법에 대한 몇 가지 코드가 추가되었습니다 (requestBuf가 완전하게 설정되는 방법을 보여주기가 어렵습니다). – Shubham

+0

recBuf를 NUL 종료로 처리하지 않으려면 \ 0? – Shubham

답변

2

: 당신은 원격 끝 (아마) 4 또는 8 바이트를 전송하는

if(send(remoteSock, requestBuf, sizeof(requestBuf), 0) < 0) 

. requestBuf은 포인터 유형 인 char *으로 선언됩니다. sizeof(requestBuf) 대신에 사용자가 작성한 요청의 실제 길이를 전달해야합니다 (귀하의 경우에는 req.GetTotalLength()).