Как boost.asio определяет, какой порт прослушивает мое серверное приложение?

мне немного странно, что boost.asio не использует базовую концепцию при подключении клиентского приложения к серверу - используя IP-адрес и порт. Может быть, я немного новичок в Boost - и я согласен с этим - но в любом случае я не понимаю.
Итак, у меня есть такой код, чтобы подключить клиента к серверу на локальном хосте:


        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        tcp::resolver::query query("localhost", "daytime"); 
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
        tcp::resolver::iterator end;

        tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while(error && endpoint_iterator != end) {
            socket.close();
            socket.connect(*endpoint_iterator++, error);
        }

Windows в своем WinSock 2.0 использует два параметра — IP и порт — для идентификации сервера.
Итак, вопрос - как именно Asio узнает, на каком порту сервер прослушивает соединения? Он сканирует все порты? И если это так, что произойдет, если два сервера одновременно прослушивают разные порты?


person chester89    schedule 23.02.2009    source источник


Ответы (3)


Вы сообщаете ему, что хотите подключиться к локальному хосту через порт, используемый дневной службой. Он будет искать соответствующий номер порта в файле сервисов (обычно C:\WINDOWS\system32\drivers\etc\services в Windows, я полагаю, /etc/services в Unix). Вы также можете использовать явный номер порта.

person Ferruccio    schedule 23.02.2009
comment
Я не совсем понял, что означает второй параметр в запросе ctor. первый — это IP-адрес, к которому я хочу подключиться, верно? а что значит второе? - person chester89; 23.02.2009
comment
Второй параметр — либо номер порта, либо имя службы. Если это имя службы, asio будет искать его в файле служб, чтобы найти соответствующий номер порта для этой службы. Взгляните на файл services с помощью текстового редактора, и вы увидите, как он работает. - person Ferruccio; 23.02.2009
comment
хорошо, тогда как я могу запустить сервер на нужном мне порту? код для этого на стороне сервера: boost::asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13)); - person chester89; 23.02.2009
comment
Я не понимаю, что вы спрашиваете. Этот код уже запускает сервер, прослушивающий порт 13 (дневная служба). - person Ferruccio; 23.02.2009
comment
дневное время на самом деле является службой Windows, которая использует порт 13, хотя наш сервер не работает. Сервер настроен на использование порта 13, а клиент получает порт 13, проверяя порт дневной службы из файловых служб. Вот почему, когда вы меняете сервер на другой порт, клиент не может установить соединение. - person V-SHY; 14.10.2014

Пытаться,

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int

Чтобы ответить на ваш вопрос, вспомните, что вы запускаете сервер на порту 13. Это порт, на котором работает дневная служба Linux http://www.sorgonet.com/linux/linuxdaemons/. Следовательно, впоследствии они могут использовать query("localhost","daytime") вместо указания порта.

person Imran.Fanaswala    schedule 30.06.2009

откройте netcat для прослушивания порта 13 на локальном хосте, он примет демонстрационное соединение. введите какую-нибудь блабла, когда он подключится, и вы увидите вывод демонстрационной программы для запуска netcat, запустите: nc -l -p 13

окна? нет нетката? установить cygwin и добавить netcat

person nir    schedule 03.03.2010