【问题标题】:boost sockets in 2 threads在 2 个线程中提升套接字
【发布时间】:2013-02-13 08:43:22
【问题描述】:

我正在使用 boost 套接字和 boost 线程。 (同步套接字)。如果我理解正确,这个方案是行不通的。

using boost::asio::ip::tcp;
boost::asio::ip::tcp::socket *MySocket;
bool Key = true;

void Function1()
{
    try
    {
        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        boost::system::error_code error;
        boost::asio::ip::address address = boost::asio::ip::address::from_string(IP, error);
        tcp::endpoint ep(address, 1235);
        MySocket = new tcp::socket(io_service);
        MySocket->connect(ep);
        Key = false;
    }
    catch(std::exception e)
    {
        std::cout<<e.what;
    }
}

void Function2()
{
    boost::array <char, 8> buf;
    size_t len = MySocket->read_some(boost::asio::buffer(buf), error);
    //Always len == 0 and buf.data() is MMMMMMM
}

void main()
{
    boost::thread Thread(&Function1);
    while(Key);
    Function2();
    MySocket->close();
}

【问题讨论】:

  • 我认为简单的答案是阅读文档。它有很好的文档记录,甚至还有示例。这不是它的完成方式。此外,您正在取消引用一个 NULL 指针,它是未定义的行为。
  • 我不明白。你认为 MySocket 是 NULL 指针吗?在 function1() 中,我正在初始化并打开这个套接字。它连接到另一个程序中的端口。为什么在 Function2() 中它不起作用?我阅读了 boost::asio 的文档,但我不明白这一点。以前用c#写的,我没有这个问题。 C++ 比 c# 重:(
  • Function1 的代码描述性不够。你在哪里创建套接字的实例?提供您的实施,我们也许可以为您提供有关问题所在的线索
  • 您使用Key 的方式也很糟糕,会导致问题。试试condition variable
  • 最后,void main 是非标准的。 main 返回int,句号。

标签: c++ multithreading sockets boost boost-asio


【解决方案1】:

您使用 local io_service 创建您的套接字,在 function1 返回后被销毁。使其全球化。 (当然,不要以这种方式设计真正的应用程序!坚持使用 Asio 文档中描述的方法。)

【讨论】:

  • 我知道这一点,但我只是想把它做好。感谢全球 io_service。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多