【发布时间】:2019-10-23 18:52:18
【问题描述】:
我正在做一个关于代理服务器的练习。 在代理服务器中缓存时我遇到了一些问题。 当服务器向代理发送响应并代理将其转发给客户端时,使用以下源代码。没关系。
//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_DECORDING_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;
}
【问题讨论】:
-
File << Data;不应用于写入二进制数据,您也忽略实际接收到的数据量。memset(Data, 0, 1024);使用了一些幻数。 -
您能详细解释一下收到的数据吗?长度是接收到的字节数,我认为没关系。 memset 尝试将 Data 设置为空数组字符。 (之前,我声明 char* Data=new char[1024]
-
那你在传递
sizeof(Data)的时候有错误。接收的字节数可能少于请求的字节数。 -
哦@VTT,我明白了这个问题,谢谢家伙! :D
-
顺便说一句,我认为
sizeof(Data)是我可以接收的最大字节数。我认为当我收到的少于它时这不是问题。
标签: c++ sockets http encoding httpresponse