2016-04-07 30 views
0

シンプルなソケットクラスを作成しています。私はソケットを書こうとしています例に従ってhttp://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_client.cppブーストアシオは接続されましたがメッセージを送信できません

私はサーバーに接続できますがログには表示できません。メッセージは送受信できません。 wiresharkでは発信メッセージは表示されませんが、着信メッセージは表示されます。 私はio_serviceが別のスレッドで実行されていることを理解しており、メッセージの受信やメッセージの送信が可能である必要があります。

(私はこの問題を説明し、この時に停止したため、それは不完全なクラスである)

IOServiceのは、クラス(メイン)の外部で定義されて

#include <iostream> 
#include <thread> 
#include <boost/thread/thread.hpp> 
#include "TCP/TCPSocket.h" 

using namespace std; 

int main() 
{ 
    Traces::SetTraceFolder("trace"); 

    boost::asio::io_service io_service; 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 



    TCPSocket socket("192.168.0.7", "6000", io_service); 

    char *c = new char[100]; 


    while (true) { 

     std::cin >> *c; 
     socket.WriteMessage(c); 

    } 

    delete [] c; 
    return 0; 
} 

私のクラス:

は "TCPSocket.h"

が含まれます
TCPSocket::TCPSocket(const std::string &adress, const std::string &port, boost::asio::io_service & serviceio) 
        : io_service(serviceio), 
         socket_(io_service), 
         resolver(io_service) 

{ 
Traces() << "\n" << "LOG: TCPSocket::TCPSocket(const std::string &adress, const std::string &port)"; 


tcp::resolver::query query(adress, port); 
querywsk = new tcp::resolver::query(" ", " "); 



*querywsk = query; 
iterator = resolver.resolve(*querywsk); 

    boost::asio::async_connect(socket_, iterator, 
     boost::bind(&TCPSocket::HandleConnect, this, 
     boost::asio::placeholders::error)); 

} 

void TCPSocket::HandleConnect(const boost::system::error_code& error) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::HandleConnect(const boost::system::error_code& error)"; 

    if (!error) 
    { 
    boost::asio::async_read(socket_, 
     boost::asio::buffer(data, std::strlen(data)), 
     boost::bind(&TCPSocket::HandleConnect, this, 
      boost::asio::placeholders::error)); 
    } else 
    { 
     Traces() << "\n" << "ERR:"; 
    } 
} 


void TCPSocket::WriteMessage(char *dataToSend) 
{ 
    io_service.post(boost::bind(&TCPSocket::Write, this, dataToSend)); 
} 

void TCPSocket::Write(char *dataToSend) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::Write(char *dataToSend)"; 

    data = dataToSend; 

    boost::asio::async_write(socket_, 
     boost::asio::buffer(data, std::strlen(data)), 
     boost::bind(&TCPSocket::HandleWrite, this, 
      boost::asio::placeholders::error)); 

} 

void TCPSocket::HandleWrite(const boost::system::error_code& error) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::HandleWrite(const boost::system::error_code& error)"; 

    if (!error) 
    { 

     boost::asio::async_write(socket_, 
      boost::asio::buffer(data, 
      100), 
      boost::bind(&TCPSocket::HandleWrite, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     Traces() << "\n" << "ERR:"; 
    } 
} 

答えて

2
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 

コードのこの早い段階で、io_serviceには何の作業もありません。

スレッドが起動すると、スレッド内でio_serviceが起動し、何もしないので、immediatlyで停止します。

何も起こりません。

作業をセットアップしたら、io_serviceを開始する必要があります。


コードに他に重大な問題があります。接続要求を待ち受けるソケットサーバーと、メッセージを送受信する接続との間で少し混乱しているようです。

http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/tutorial.htmlでチュートリアルの例を試してみることをお勧めします。これらの作業を終えたら、何が起こっているのかをはっきりと理解できます。

+0

さらに、t.join()を追加します。 – kometen

+0

ありがとう!今それは動作します! –

関連する問題