2011-08-05 24 views
2

私はC++で双方向非同期通信を実装しようとしています。 2台のマシンでIPアドレスとポート番号を指定し、マシン間で通信できるようにしたいと考えています。C++での双方向非同期通信

私はブースト:: ASIO見てきたし、これまでに次のように実装している:

#include <cstdlib> 
#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 

class session{ 
public: 
    session(boost::asio::io_service& io_service) : socket_(io_service){ 

    } 
    tcp::socket& socket(){ 
    return socket_; 
    } 
    void start(){ 
    socket_.async_read_some(boost::asio::buffer(data_, max_length),boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
    onConnect(); 
    } 
    void handle_read(const boost::system::error_code& error, size_t bytes_transferred){ 
     if (!error){ 

      char* buf = boost::asio::buffer_cast<char*>(boost::asio::buffer(data_, bytes_transferred)); 

      char buf2[bytes_transferred]; 
      int n; 
      n=sprintf(buf2,"%.*s",bytes_transferred,buf); 
      onData(buf2); 

      boost::asio::async_write(socket_, boost::asio::buffer("\0",0), boost::bind(&session::handle_write, this, boost::asio::placeholders::error)); 
    }else{ 
     delete this; 
    } 
    } 
    void handle_write(const boost::system::error_code& error){ 
    if (!error){ 
     socket_.async_read_some(boost::asio::buffer(data_, max_length),boost::bind(&session::handle_read, this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred)); 
    }else{ 
     delete this; 
    } 
    } 
    void onConnect(){ 
     printf("Connected\n"); 
    } 
    void onData(char* buf){ 
     printf("%s",buf); 
    } 
    void write(const char* data){ 
     //boost::asio::async_write(socket_, boost::asio::buffer(data, strlen(data)), boost::bind(&session::handle_write, this, boost::asio::placeholders::error)); 
    } 
private: 
    tcp::socket socket_; 
    enum { max_length = 1500 }; 
    char data_[max_length]; 
}; 

class server{ 
public: 
    server(boost::asio::io_service& io_service, short port) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port)){ 
    session* new_session = new session(io_service_); 
    acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); 
    } 
    void handle_accept(session* new_session, const boost::system::error_code& error){ 
    if (!error){ 
     new_session->start(); 
     new_session = new session(io_service_); 
     acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); 
    }else{ 
     delete new_session; 
    } 
    } 
private: 
    boost::asio::io_service& io_service_; 
    tcp::acceptor acceptor_; 
}; 

int main(int argc, char* argv[]){ 
    try{ 
    if (argc != 2){ 
     std::cerr << "Usage: async_tcp_echo_server <port>\n"; 
     return 1; 
    } 
    boost::asio::io_service io_service; 

    using namespace std; // For atoi. 
    server s(io_service, atoi(argv[1])); 

    io_service.run(); 
    }catch (std::exception& e){ 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 
    return 0; 
} 

私は、このサーバーにtelnetし、それにメッセージを送信するが、どのようにリモートからプログラム的にこのサーバーにアクセスすることができます機械?私はこのコードからIPアドレスを指定することができないようです!

私は誰かがいくつかのポインタを持っていることを願っています。

+0

TCPは対称ではありません。どちらがどちらであるかは気にする必要はありませんが、一方のマシンは接続を開始し、もう一方はそれを受け入れる必要があります。あなたはサーバ/受け入れ側を書きました、もう片方のマシンはこのサーバのIP /ポートに接続する必要があります。 –

答えて

2

私はBoost.ASIOを使用していませんでしたが、 "ASIOにgethostbynameを高める" "ASIO IPアドレスを高める" との検索がこのようなものが得られた:

http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/reference/ip__address.html

http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/reference/ip__tcp/resolver.html

は、リゾルバが持っているのあなたのようなことを行うことができますresolve方法:

boost::shared_ptr<boost::asio::io_service> io_service(
    new boost::asio::io_service 
); 
boost::asio::ip::tcp::resolver resolver(*io_service); 
boost::asio::ip::tcp::resolver::query query( 
    "www.google.com", // host string 
    boost::lexical_cast<std::string>(80) // port # 
); 
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query); 
boost::asio::ip::tcp::endpoint endpoint = *iterator; 

はだから持つことにあなたを取得しますクライアントコードのソケット接続で使用できるboost::asio::tcp::endpointがあります。あなたはより多くの細部をしたい場合、私はこれをつかんサイトはこちら:

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=8

1

正しい方向にあなたを導くためにBoost.Asio pages良い例の多くがあります。

簡単に言えば、あなたはサーバーとクライアントを書く必要があります。前者は接続先のエンドポイントを作成し、後者は接続します。例を見てみましょう。彼らは非常に簡単で、あなたのニーズに適応するのは簡単です。

関連する問題