2012-05-14 8 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; '行のように扱わないでください。 – Celada

+0

私は提案(1)を含んだ。 requestBufの設定方法に関するいくつかのコードが追加されました(requestBufが完全にセットアップされていることを示すのは難しいです) – Shubham

+0

recBufをNUL終了として扱わないようにするには、 \ 0それに? – Shubham

答えて

2

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

あなただけのリモートエンドに(おそらく)4つのまたは8バイトを送信しています。 requestBufは、ポインタ型のchar *と宣言されています。 sizeof(requestBuf)の代わりに、あなたが作成したリクエストの実際の長さを渡す必要があります。あなたのケースではreq.GetTotalLength()と思われます。

関連する問題