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);


recBuf の cout.flush() は何も出力しません。
何が起こっているかについてのアイデアはありますか?

4

1 に答える 1

2

このコードでは:

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

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

于 2012-05-14T14:08:45.603 に答える