【问题标题】:C++ - Running one server thread and one client thread in the same programC++ - 在同一个程序中运行一个服务器线程和一个客户端线程
【发布时间】:2014-05-19 10:25:28
【问题描述】:

我一直在尝试修改 boost 的白天服务器/客户端示例,使其在 2 个线程中运行,如下所示,但没有成功:

#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/thread.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);
}

void ServerThread()
{
    boost::asio::io_service io_service;
    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

    for (;;)
    {
        std::cout << "why?";
        tcp::socket socket(io_service);
        acceptor.accept(socket);
        std::string message = make_daytime_string();
        boost::system::error_code ignored_error;
        boost::asio::write(socket, boost::asio::buffer(message),
        boost::asio::transfer_all(), ignored_error);
    }

}

void ClientThread()
{
    try
  {
    boost::asio::io_service io_service;

    std::string hostString;

    std::cout << "Please enter the host: ";
    std::cin >> hostString;

    tcp::resolver resolver(io_service);
    tcp::resolver::query query(hostString, "daytime");
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

    tcp::socket socket(io_service);
    boost::asio::connect(socket, endpoint_iterator);
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
}

int main()
{
  boost::thread s(&ServerThread);
  boost::thread c(&ClientThread);

  c.join();
  s.join();

  return 0;
}

两个线程一个接一个地立即运行,不会正确处理。我想我需要沿着分叉线做一些事情?请帮忙告诉我代码有什么问题,谢谢。

【问题讨论】:

  • 如果您正在制作一个真正的客户端/服务器应用程序,如果您为客户端和服务器创建单独的进程(而不是单独的线程),您可能会为自己省去很多麻烦。
  • 完全同意,我只是在玩弄线程机制。初学者。

标签: c++ multithreading client-server


【解决方案1】:

在您的客户端中,您省略了接收数据的代码部分。连接后放入:

for (;;)
{
    boost::array<char, 128> buf;
    boost::system::error_code error;

    size_t len = socket.read_some(boost::asio::buffer(buf), error);
    if (error == boost::asio::error::eof)
        break; // Connection closed cleanly by peer.
    else if (error)
        throw boost::system::system_error(error);
    std::cout.write(buf.data(), len);
}

您还需要包含 boost/array.hpp。

【讨论】:

  • 谢谢你解决了这个问题,我遇到了很多错误,所以我拿出了打印输出部分。经过更多故障排除后,它现在可以正常工作了:)。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多