我目前正在开发一个带有 c++ 后端的 html/javascript 前端来完成所有的计算。两者都通过处理所有请求的集成小型 dlib 网络服务器连接。前端请求这样的数据:
pop=$.ajax({ //load Population array of 90
type:"POST",
url: "Pop90",
async:false
});
eval(pop.responseText);
然后,网络服务器在单个字符串中返回一个大数组(长度约为 4 000 000)。如果我通过本地主机连接,这非常有效,但我无法在另一台计算机上远程访问服务器。浏览器只是加载了一段时间然后超时,但我可以看到服务器上的所有请求。服务器抛出错误:dlib.server_http:来自客户端的 http 字段太长。但是来自客户端的http请求不应该很大,来自服务器的实际帖子是。提前很多!详细说明一下。我刚刚在 Firefox 中测试了该页面,即使通过 localhost 也无法正常工作。错误控制台是数组初始化器,它是网络服务器的响应字符串,它是这样的,但有 400 万个条目:
"ar=[-99999, -99999, ...]"
处理请求的 webserver 类如下所示:
class web_server : public server_http
{
vector<vector<double>> pop90;
vector<vector<double>> pop95;
vector<vector<double>> pop00;
public: web_server::web_server()
{
cout<<"init...";
loadArray("data/raw/afp90g.asc", &pop90);
cout<<" 90 loaded...";
loadArray("data/raw/afp95g.asc", &pop95);
cout<<" 95 loaded...";
loadArray("data/raw/afp00g.asc", &pop00);
cout<<" 00 loaded...";
cout<<"ready!"<<endl;
}
const std::string on_request (const incoming_things& incoming, outgoing_things& outgoing)
{
cout<<"---------------------------"<<endl;
cout<<incoming.path<<endl;
ostringstream sout;
sout<<get_file_contents("Seite.html");
cout<<"content type: "<<incoming.content_type<<endl;
cout<<"request type: "<<incoming.request_type<<endl;
string filename=incoming.path.substr(1,incoming.path.length());
if (incoming.path.substr(0,1) == "/" && incoming.path.length()>1)
{
if (incoming.path=="/css/Style.css") outgoing.headers["Content-Type"] == "text/css";
if (incoming.path.substr(0,8)=="/Pop90") return parseArray(pop90);
if (incoming.path.substr(0,8)=="/Pop95") return parseArray(pop95);
if (incoming.path.substr(0,8)=="/Pop00") return parseArray(pop00);
return get_file_contents(filename.c_str());
}
return sout.str();
}
};
好的,所以我对 server_http.cpp 文件进行了一些修改,以创建传入流的完整转储。只要在本地连接,就好像在完美的 http 消息之间有随机的 -1 值 (EOF)。如果我通过我的实际 IP 远程连接,则只有 -1 值进入。我停用了我的防火墙/防病毒软件。端口转发应该没问题。我仍然不知道该怎么办。