0

我目前正在开发一个带有 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 值进入。我停用了我的防火墙/防病毒软件。端口转发应该没问题。我仍然不知道该怎么办。

4

2 回答 2

1

为了防止客户端淹没服务器并耗尽其内存,dlib 的 Web 服务器对 HTTP 标头和查询路径字符串的长度进行了限制。具体来说,它要求每个单独的长度小于 16KB,如果客户端尝试发送的长度超过该长度,则会给出您看到的“来自客户端的 http 字段太长”错误消息。

因此,您必须以某种方式生成一条非常长的路径,或者您正在发送回一个非常大的标头(可能来自您正在创建的一个大 cookie?)。您可以通过编辑 dlib/server/server_http.cpp 中的第 129 行将 16KB 限制更改为其他内容。如果可以通过调用成员函数来设置它会更好(因为我是 dlib 的作者 :))我将在下一个版本中将其作为一个功能。

但无论如何,您达到 16KB 的限制令人惊讶,因为考虑到路径字符串和 HTTP 标头的通常长度,这确实是一个相当大的限制。因此,您的 HTTP 客户端代码中可能还发生了其他事情。

于 2013-09-06T03:41:06.430 回答
0

好的,所以我想我已经弄清楚了。显然我的路由器缺少一个称为 NAT 环回的功能。所以我的网络服务器确实可以远程工作,只是无法从 LAN 网络中访问。

来源为德语:http: //forum.telekom.de/foren/read/service/dsl-festnetz/speedports/speedport-700er-serie/w723v-typ-b-portweiterleitung-funktioniert-nicht-mehr,510,8862346 ,page=2.html

于 2013-09-12T07:17:02.000 回答