2009-08-24 36 views
0

我做了一个使用boost asio的套接字应用程序,当我尝试从套接字读取任何东西时,似乎需要很多cpu。增强asio在读取100%CPU时

大气压我使用一个包装类,所以我没有暴露在我的头文件看起来是这样的升压头文件:

class SocketHandle 
{ 
public: 
    SocketHandle() 
    { 
     m_pSocket = NULL; 
     m_pService = NULL; 
    } 

    ~SocketHandle() 
    { 
     delete m_pSocket; 
     delete m_pService; 
    } 

    void connect(const char* host, const char* port) 
    { 
     if (m_pSocket || m_pService) 
      return; 

     m_pService = new boost::asio::io_service(); 

     tcp::resolver resolver(*m_pService); 
     tcp::resolver::query query(tcp::v4(), host, port); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
     tcp::resolver::iterator end; 

     m_pSocket = new tcp::socket(*m_pService); 

     boost::system::error_code error = boost::asio::error::host_not_found; 

     while (error && endpoint_iterator != end) 
     { 
      (*m_pSocket).close(); 
      (*m_pSocket).connect(*endpoint_iterator++, error); 
     } 

     if (error) 
      throw ... 
    } 

    tcp::socket* operator->() 
    { 
     return m_pSocket; 
    } 

private: 
    tcp::socket *m_pSocket; 
    boost::asio::io_service *m_pService; 
}; 

,然后即时阅读从插座上,像这样:

size_t recv(char *data, size_t size) 
{ 
    boost::system::error_code error; 
    size_t len = (*m_pSocket)->read_some(boost::asio::buffer(data, size), error); 

    if (error) 
       throw ... 

    return len; 
} 

我做错了什么?有没有更好的方式从套接字读取数据?

升压1.39.0 的Visual C++ 窗口

回答

0

你应该避免紧张while循环:

// BAD. 
while (error && endpoint_iterator != end) 
{ 
    (*m_pSocket).close(); 
    (*m_pSocket).connect(*endpoint_iterator++, error); 
} 

而是尝试类似:

try 
{ 
    (*m_pSocket).connect(*endpoint_iterator++, error); 
    // ... 
} 
catch (std::exception& ex) 
{ 
    // Release resources, then try connecting again. 
} 

也看到这些examples在对使用Asio的正确成语。

+0

这是从升压asio例子:P – Lodle 2009-08-24 04:59:10

+0

但问题是读取不是连接代码。 – Lodle 2009-08-24 05:01:27

0

考虑使用免费的功能,而不是,

size_t len = asio::read(*m_pSocket,asio::buffer(data, size), error); 
+0

为什么?有什么区别吗? – 2017-09-25 16:35:53

1

的变化,你不妨考虑一下(我强烈推荐),就是让你的插座异步调用。这样你就不必担心线程被阻塞或任何套接字调用在内部旋转(我怀疑这可能是你所看到的)。相反,您只需提供一个回调,它将收到任何错误和收到的字节数。

Boost文档中有很多examples说明如何做到这一点,我发现它有助于更​​高效地使用线程和处理器资源。