Мое приложение — это серверное приложение, которое принимает некоторые предопределенные команды от пользователя и отображает соответствующий вывод, полученный из файлов XML, имеющихся на стороне сервера.
Для анализа XML-файла я использую библиотеку xerces-c версии 3.1.2 из apache. Приложение работает нормально, когда запускается вручную на терминале.
Но я хотел запустить приложение через telnet в сети, чтобы я мог передавать входные данные приложению через telnet и получать выходные данные в удаленной системе. Для этого я использовал супер-сервер inetd и добавил следующую строку в inetd.conf:
vterm stream tcp nowait root /path/to/my/binary/vterm vterm
Затем добавьте строку ниже в / etc / services, чтобы он прослушивал порт 5000
vterm 5000/tcp
После этого, когда я пытался подключиться к своему приложению, я получал сообщение ниже:
msatyam@sabayon ~/programming/cpp/xml $ telnet localhost 5000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Когда вышеприведенное сообщение о закрытии соединения пришло, я подумал, что не правильно настроил свое приложение с помощью inetd. Итак, я заменил свой двоичный файл на простой двоичный файл, который не использовал никаких дополнительных библиотек. Просто Cin’s и Cout’s, которые отлично работали.
Тогда, оказывается, что-то не так с моим приложением, поэтому для этого я приложил много усилий, чтобы определить, что на самом деле происходит. После этого я обнаружил, что одна из функций библиотеки синтаксического анализа XML xerces-c возвращает NULL, и с помощью этой ссылки NULL я пытаюсь вызвать функцию в строке ниже, которая выполняет дамп моего приложения, как только он запускается.
Но дело в том, что та же функция работает нормально, когда я запускаю приложение вручную на терминале. Полное приложение немного велико, поэтому я создал демонстрационный код, который воспроизводит проблему. Вот мой код:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main()
{
try
{
// init xerces XML Parser library
XMLPlatformUtils::Initialize();
}
catch (const XMLException& ex)
{
cerr << ex.getMessage() << endl;
}
// parse a XML file
XercesDOMParser* parser = new XercesDOMParser();
try
{
parser->parse("sample.xml");
}
catch (const XMLException& ex)
{
cerr << ex.getMessage() << endl;
}
// get the document reference
DOMDocument* doc = parser->getDocument();
if (doc == NULL)
{
cout <<"Doc is NULL" << endl;
}
// else do stuff further
// like get root element
DOMElement* root = doc->getDocumentElement();
// print node name
string name = XMLString::transcode(root->getTagName());
cout << "Name: " << name << endl;
XMLPlatformUtils::Terminate();
return 0;
}
Приведенный выше код при компиляции и запуске вручную не входит в условие if, которое говорит «Doc is NULL» и успешно печатает имя тега корневого элемента, но когда я запускаю это приложение за inetd и когда я telnet к нему, я вижу «Doc is NULL» и после того же сообщения «Соединение закрыто внешним хостом». как мое приложение, вероятно, будет сбрасывать.
Сейчас я немного не в себе, так как не знаю, где именно искать. Так же код работает, когда запускается вручную, но не через inetd.
Итак, я думаю, нужно ли уделять особое внимание при выполнении процессов через inetd, который использует разделяемые библиотеки, как здесь я использую разделяемую библиотеку xerces-c для анализа XML.
Или что еще может быть не так с моим пониманием или моим кодом.
Почему одни и те же библиотечные функции прекрасно работают, когда приложение запускается вручную, и не работают при запуске через inetd?
Я попробовал то же самое, используя xinetd вместо inetd, но результаты те же.
Как вы уже убедились, рабочий каталог /
когда вы запускаете инструмент через inetd
, Но ваш XML-файл не находится в корневом каталоге вашей системы. Вы можете проложить полный путь к вашему приложению. Лучшим решением было бы передать местоположение вашего файла (ов) в качестве параметра.