2013-03-20 3 views
0

У меня есть два переключателя 'i' и 'p', которые представляют IPAddress и Port соответственно.Каков формат командной строки программы BOOST?

Каков формат командной строки?

Я попытался:

app -i192.168.1.1 -p12345 
app -i 192.168.1.1 -p 12345 
app -i=192.168.1.1 -p=12345 
app -i='192.168.1.1' -p='12345' 
app --IPAddress 192.168.1.1 --Port12345 

Мое приложение имеет проблему с IPAddress и устранения неполадок с DDD является unrevealing как я получаю для виртуальной машины.

Кроме того, приложение работает как демон, поэтому мои инструкции cout для IP-адреса и порта уходят в небытие, а печать в syslog затрудняется тем фактом, что вывод значений не является константой char *.

Я планирую использовать программные опции и для других вещей, но я немного нахожусь над моей головой.

po::options_description config("Configuration"); 
     config.add_options() 
      ("IPAddress,i","IP Address") 
      ("Port,p","Port") 
      ; 
po::variables_map vm; 
     po::store(po::parse_command_line(ac, av, config), 
         vm); 

     po::notify(vm); 
//...and this is how the values are used 

int retval = getaddrinfo((vm["IPAddress"].as<string>()).c_str(),(vm["Port"].as<string>()).c_str(), &hint, &list); 

Здесь не полная программа ... ничего выводится на консоль после «значений»:

#include <sstream> 
#include <algorithm> 
#include <stdlib.h> 
#include <iterator> 
#include <string> 

//Using boost program options to read command line and config file data 
#include <boost/program_options.hpp> 
using namespace std; 
using namespace boost; 
namespace po = boost::program_options; 

int main (int argc, char *argv[]) 
{ 
    po::options_description config("Configuration"); 
    config.add_options() 
       ("IPAddress,i","IP Address") 
       ("Port,p","Port") 
       ; 

    po::variables_map vm; 
    po::store(po::parse_command_line(argc, argv, config),vm); 
    po::notify(vm); 

    cout << "Values\n"; 

    cout << (vm["IPAddress"].as<string>()).c_str(); 
    cout << " " << (vm["Port"].as<string>()).c_str(); 

    return 0; 

} 

являются введенные значения каким-то образом нецензурным?


Вот выход GDB, кажется, быть отлита проблема:

28    string address = (vm["IPAddress"].as<string>()).c_str(); 
(gdb) n 
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >' 
    what(): boost::bad_any_cast: failed conversion using boost::any_cast 

Program received signal SIGABRT, Aborted. 
0x0000003afd835935 in raise() from /lib64/libc.so.6 
+3

Вместо того, чтобы работать непосредственно с вашим приложением daemon, почему бы вам не создать отдельный тестовый пример для этого, чтобы понять, как его использовать в изоляция? –

+0

Я думал об этом. Я думаю, что это хороший подход, потому что при текущей настройке существует множество тестов на осложнения. – bentaisan

+1

Опубликовать код –

ответ

1

варианта BOOST программа поддержки вкусов коммандной строки, известные из систем Unix. Таким образом, эти два должны работать (они работают для меня)

app -i 192.168.1.1 -p 12345 
app --IPAddress=192.168.1.1 --Port=12345 

Примечания:

  • документации с основным учебником является at boost.org (вероятно, вы уже знаете это)
  • написания теста автономного блока ибо это, безусловно, хороший совет; boost также обеспечивает простую в использовании тестовую среду для C++
+0

Можете ли вы посмотреть вывод gdb и дать мне подсказку? Сейчас я ищу в Интернете, но у кого-то есть быстрое решение. Похоже, что они могут быть несоответствием rtti. Может быть, потому, что я компилирую для 64-битной цели? – bentaisan

+0

странно ... вы уверены, что на самом деле такой параметр? что дает vm.count («IPAddress»)? он должен быть 1 (один экземпляр параметра). Если он равен нулю, то несуществующий результат действительно не может быть отлит в строку – Ichthyo