2009-08-24 9 views
0

私はソケットから何かを読み込もうとするとCPUを大量に消費するようです。boost 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

ループしながら、あなたはタイトを回避する必要があります。

// 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

これはboost asioの例です:P – Lodle

+0

しかし、問題は接続コードではなく読み込みにあります。 – Lodle

0

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

なぜですか?何か違いはありますか? –

1

、代わりにあなたが考慮することを望むかもしれない(と私は非常にお勧め)の変化を自由に機能を使用することを検討しては、あなたのソケットが非同期を呼び出すようにすることです。そうすれば、スレッドがブロックされたり、内部でスピンしているソケット呼び出し(私があなたが見ているかもしれないと思われる)について心配する必要はありません。代わりに、エラーと受け取ったバイト数を受け取るコールバックを提供するだけです。

Boostドキュメントには、これを行う方法を説明するたくさんのものがあります。スレッドとプロセッサリソースをはるかに効率的に使用できることがわかりました。

関連する問題