【问题标题】:C++ boost/asio client doesn't connect to serverC ++ boost / asio客户端未连接到服务器
【发布时间】:2010-07-24 17:37:00
【问题描述】:

我正在学习 boost/asio 广告,从电子书中编写了 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 用于发布可编译的示例代码,这样更容易回答您的问题。

标签: c++ linux networking boost-asio


【解决方案1】:

second parameterip::tcp::resolver::query 是服务名称,而不是端口号:

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

应该是

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

fyi,当我在我的系统上编译你的代码时它失败了:

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]’

我很惊讶它为你编译。

【讨论】:

  • 我在 linux "g++ -lboost_system -pthread client.cpp" 上编译它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2012-03-07
  • 2013-12-26
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
相关资源
最近更新 更多