简单的服务器/客户端提升示例无效

时间:2009-04-04 19:11:54

标签: c++ boost tcp boost-iostreams

学习提升,并编译他们的日间服务器客户端example。由于我无法使用示例中的端口13,因此我只更改了服务器和客户端示例中的端口号。服务器运行正常,但似乎客户端没有连接它,并且没有给出错误。

客户端的输入数据是“127.0.0.1”。

服务器:

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

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    boost::asio::io_service io_service;

    tcp::endpoint endpoint(tcp::v4(), 8087);
    tcp::acceptor acceptor(io_service, endpoint);

    for (;;)
    {
      tcp::iostream stream;
      acceptor.accept(*stream.rdbuf());
      stream << "test" << make_daytime_string();
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

客户:

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

using boost::asio::ip::tcp;

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: daytime_client <host>" << std::endl;
      return 1;
    }

    tcp::iostream s(argv[1], 8087);
    std::string line;
    std::getline(s, line);
    std::cout << line << std::endl;
  }
  catch (std::exception& e)
  {
    std::cout << "Exception: " << e.what() << std::endl;
  }

  return 0;
}

4 个答案:

答案 0 :(得分:2)

对我有用的是改变我从

创建端点的方式
tcp::endpoint( tcp::v4(), port );

tcp::endpoint( boost::asio::ip::address::from_string("127.0.0.1"), port );

第一种方法创建一个0.0.0.0的端点,可以在Mac OS X上正常工作,但在Windows上提供“无效”消息(XP,使用MSVC 2008构建)。

我不介意为什么会有这种差异,但至少它是有效的。

答案 1 :(得分:1)

嗯,所有这些都适用于1_36 boost版本和msvc 2005 compiller 检查防火墙设置。

答案 2 :(得分:1)

有些事情可以帮助您调试:

  1. 您正在运行什么平台
  2. 您使用的是哪种编译器,包括版本
  3. 您使用的是什么版本的提升
  4. 另外,要检查的一件事是服务器是绑定到127.0.0.1还是外部接口。尝试使用外部接口的IP地址而不是127.0.0.1。使用ipconfig在windows中检查,使用ifconfig在linux中检查。

答案 3 :(得分:1)

port选项将一个字符串(可能是服务的名称)作为“daytime”,然后它会查找相应的端口,或者显式地查找端口,但它必须是一个字符串:

tcp :: iostream s(argv [1],“8087”);