2013-09-03 3 views
0

В настоящее время я разрабатываю интерфейс html/javascript с бэкэнд C++, который выполняет все вычисления. Оба подключаются через интегрированный небольшой веб-сервер dlib, который обрабатывает все запросы. Эти запросы данных во внешнем интерфейсе, как это:Не удается подключиться к dlib webserver удаленно, localhost действительно работает

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

Веб-сервер возвращает то большой массив (длина около 4 000 000) в виде одной строки. Это работает отлично, если я подключаюсь через localhost, но я не могу получить доступ к серверу удаленно на другом компьютере. Браузер просто загружает время, а затем истекает время, но я вижу все запросы на сервере. Сервер выдает ошибку: dlib.server_http: http-поле из клиента слишком длинное. Но HTTP-запрос от клиента не должен быть большим, фактический пост с сервера. Thx много заранее! Чтобы разработать немного больше. Я просто протестировал страницу в firefox, которая не работает даже через localhost. Консоль ошибок ВОФК инициализатор массива, который является respinse строка веб-сервер, и он идет, как это, но с как 4 миллионов словарных статей:

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

класс веб-сервер, который обрабатывает запрос выглядит следующим образом:

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, чтобы создать полный дамп входящего потока. Это швы, как будто есть случайные -1 значения (EOF) между прекрасно прекрасными сообщениями HTTP до тех пор, пока они подключаются локально. Если я подключаюсь удаленно с помощью моего фактического ip, вы получаете только -1 значений. Я дезактивировал свой брандмауэр/антивирус. Переадресация портов должна быть в порядке. Я до сих пор не знаю, что делать.

ответ

0

Итак, я думаю, что я понял. По-видимому, мой маршрутизатор пропускает функцию под названием NAT loopback. Поэтому мой веб-сервер работает удаленно, я просто не доступен из локальной сети.

Источник на немецком языке: 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

1

Чтобы предотвратить наводнение сервера сервером и исчерпание его памяти, веб-сервер dlib имеет ограничение на длину заголовков HTTP и строку пути запроса. В частности, для каждого из них требуется индивидуально меньше 16 КБ, и если клиент пытается отправить больше, чем это, он дает сообщение об ошибке «http field from client is too long», которое вы видите.

Таким образом, вы должны каким-то образом генерировать действительно длинный путь или, может быть, вы отправляете обратно очень большой заголовок (возможно, из большого файла cookie, который вы создаете?). Вы можете изменить предел 16KB на что-то еще, отредактировав строку 129 в dlib/server/server_http.cpp. Было бы лучше, если бы это можно было установить, вызвав функцию-член (так как я автор dlib :)). Я сделаю эту функцию в следующей версии.

Но в любом случае удивительно, что вы нажимаете предел 16KB, так как это действительно довольно большой предел, учитывая обычные длины строки пути и заголовков HTTP. Таким образом, в вашем HTTP-клиентском коде может быть что-то еще.

+0

Thx для ответа. Несмотря на то, что я не думаю, что это часть реальной проблемы, поскольку ошибка возникает при подключении к локальному хосту, а страница работает нормально, мне удалось достоверно воспроизвести ее. Если Javascript загружает содержимое html в элемент div через: '$ ("# test"). Load ("content/config.html"); он работает напрямую, но вскоре примерно через 10 секунд возникает ошибка. Я отправлю свой код на C++ в исходный вопрос. – user2160180

+1

Ваш код выглядит отлично. Я бы поставил оператор печати на сайт throw (dlib/server/server_http.cpp line 140) и напечатал строку длиной до 16KB и посмотрел, что это такое. –

+0

Отличная идея!Я попробовал cout << буферную переменную, а также ее размер, оказалось, что она пуста. Ошибка вызывается из-за другого условия (in.peek() == EOF) – user2160180

Смежные вопросы