无法远程连接到dlib Web服务器,localhost可以工作
Cannot connect to dlib webserver remotely, localhost does work
我目前正在开发一个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
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 无法远程连接到dlib Web服务器,localhost可以工作