如何存储http响应并发送到浏览器?

时间:2019-06-08 16:41:59

标签: c++ sockets http encoding httpresponse

我正在做有关代理服务器的练习。 在代理服务器中缓存时遇到一些问题。 当服务器向代理发送响应并将代理转发给客户端时,将使用以下源代码。很好。

//that code is ok
fstream File;
while (P->isClientClose == FALSE && P->isServerClose == FALSE){
    memset(Data, 0, 1024);
    int length = recv(*(P->SERVER), Data, sizeof(Data), 0);
    if (length <= 0)
        break;
    length = send(*(P->CLIENT), Data, length, 0);
    if (length <= 0)
        break;
}

但是当我尝试将HTTP响应写入文件,然后从文件读取所有字符以发送给客户端时,出现了问题。 浏览器说:ERR_CONTENT_DECODING_FAILED

我正在测试代理缓存的工作方式,但是我不知道错误在哪里。 即使当我创建一个字符串Temp(Data),并使用send(*(P-> CLIENT),Temp.c_str(),length,0)时,客户端仍然会说该错误。 请帮我。 :D

//that code is error
fstream File;
while (P->isClientClose == FALSE && P->isServerClose == FALSE){
    memset(Data, 0, 1024);
    int length = recv(*(P->SERVER), Data, sizeof(Data), 0);
    if (length <= 0)
        break;

    File.open("test.dat", ios::out|ios::binary);
    File << Data;
    File.close();
    File.open("test.dat", ios::in|ios::ate|ios::binary);
    ifstream::pos_type pos = File.tellg();
    int size = pos;
    cout << "size: " << size << endl;
    char *pChars = new char[size+1]{};
    File.seekg(0, ios::beg);
    File.read(pChars, size);
    File.close();   
    length = send(*(P->CLIENT), pChars, length, 0);
    delete[]pChars;
    if (length <= 0)
        break;
}

1 个答案:

答案 0 :(得分:0)

还有一些事情要解决。

更新:您似乎已经对通讯进行了排序,所以我删除了该运球。

但是我认为您的问题就在这里:      文件<<数据;

VTT正确无误,它指出File << Data不会将指针Data的全部内容写入该文件。 <<操作符不知道要写入的数据长度。另外,<<运算符似乎没有char *重载。参见:http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

我认为Data是char *。

代替文件<<数据,请尝试:

 File.write( Data, length);    

然后将其读回并写入客户端。...