Клиент C ++ boost / asio не подключается к серверу - PullRequest
3 голосов
/ 24 июля 2010

Я изучаю boost / asio ad, написал 2 программы (клиент и сервер) из электронной книги с небольшими изменениями.В основном это должно подключиться к моему серверу.Когда я пытаюсь подключиться к внешнему миру (некоторый случайный http-сервер), все хорошо, и это работает, но когда я меняю место назначения на "localhost: 40002", он говорит неверный аргумент.

код клиента:

#include <boost/asio.hpp>
#include <iostream>

int main () {
   try {
      boost::asio::io_service io_service;
      boost::asio::ip::tcp::resolver::query query("localhost", 40002);
      boost::asio::ip::tcp::resolver resolver(io_service);
      boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query);
      boost::asio::ip::tcp::resolver::iterator end ;
      boost::asio::ip::tcp::endpoint endpoint;

      while ( destination != end ) {
         endpoint = *destination++;
         std::cout<<endpoint<<std::endl;
      }

      boost::asio::ip::tcp::socket socket(io_service);
      socket.connect(endpoint);
   }
   catch (std::exception& e)
   {
      std::cerr << e.what() << std::endl;
   }
   return 0;
}

я сделал "netstat -l", и это показало, что я действительно слушаю свой порт, поэтому сервер, на мой взгляд, работает, но тем не менее они не подключаются

код сервера:

#include <boost/asio.hpp>
#include <iostream>
#include <string>
#include <ctime>
std::string time_string()
{
   using namespace std;
   time_t now = time(0);
   return ctime(&now);
}
int main () {

   try {
      boost::asio::io_service io_service;
      boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 40002));

      for (; ;) {
         std::cout<<"Listening to"<<std::endl;
         boost::asio::ip::tcp::socket socket(io_service);
         acceptor.accept(socket);

         std::string message = time_string();
         boost::system::error_code ignored_error;
         boost::asio::write(socket, boost::asio::buffer(message), boost::asio::transfer_all(), ignored_error);
      }
   }
   catch (std::exception& e)
   {
      std::cerr << e.what() << std::endl;
   }
   return 0;

}

Может кто-нибудь намекнуть, почему не происходит соединение

1 Ответ

5 голосов
/ 24 июля 2010

Второй параметр - ip::tcp::resolver::query - это имя службы, а не номер порта:

  boost::asio::ip::tcp::resolver::query query("localhost", 40002);

должно быть

  boost::asio::ip::tcp::resolver::query query("localhost", "40002");

Кстати, когда я скомпилировал ваш код в моей системе, он потерпел неудачу:

resolve.cc: In function ‘int main()’:
resolve.cc:7: error: invalid conversion from ‘int’ to ‘boost::asio::ip::resolver_query_base::flags’
resolve.cc:7: error:   initializing argument 2 of ‘boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query(const std::string&, boost::asio::ip::resolver_query_base::flags) [with InternetProtocol = boost::asio::ip::tcp]’

Я удивлен, что он составлен для вас.

...