无法远程连接到dlib Web服务器,localhost可以工作

Cannot connect to dlib webserver remotely, localhost does work

本文关键字:localhost 工作 服务器 Web 远程连接 dlib      更新时间:2023-10-16

我目前正在开发一个html/javascript前端,它有一个c++后端来完成所有的计算。两者都通过一个集成的小型dlib Web服务器连接,该服务器处理所有请求。前端请求的数据如下:

pop=$.ajax({ //load Population array of 90
        type:"POST",
        url: "Pop90",
        async:false
        });
    eval(pop.responseText);

然后,Web服务器在单个字符串中返回一个大数组(长度约为4000 000)。如果我通过localhost进行连接,但无法在另一台计算机上远程访问服务器,则此操作非常有效。浏览器只是加载一段时间,然后超时,但我可以在服务器上看到所有请求。服务器抛出错误:来自客户端的dlib.server_http:http字段太长。但是来自客户端的http请求不应该太大,来自服务器的实际帖子是。提前很多!详细说明一下。我刚刚在firefox中测试了这个页面,它甚至不能通过localhost运行。错误控制台显示数组初始值设定项,它是Web服务器的respinse字符串,它是这样的,但有大约400万个条目:

"ar=[-99999, -99999, ...]" 

处理请求的Web服务器类如下所示:

    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值。我停用了防火墙/防病毒软件。端口转发应该可以。我仍然不知道该怎么办。

为了防止客户端淹没服务器并耗尽其内存,dlib的web服务器对HTTP头和查询路径字符串的长度有限制。具体来说,它要求每个字段的长度分别小于16KB,如果客户端试图发送超过16KB的内容,则会显示您看到的"来自客户端的http字段太长"错误消息。

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

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

好吧,我想我已经想好了。显然,我的路由器错过了一个叫做NAT环回的功能。所以我的网络服务器是远程工作的,我只是无法从局域网中访问。

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