オープンソースのWebベースの通信フレームワークASIO asio2は、TCP、UDP、HTTP、RPC、SSL、クロスプラットフォームは、信頼性の高いUDPをサポートしてサポートし、TCPは自動開梱、TCPデータグラムモードをサポートしています

オープンソースのWebベースの通信フレームワークASIO asio2は、TCP、UDP、HTTP、RPC、SSL、クロスプラットフォームは、信頼性の高いUDPをサポートしてサポートし、TCPは自動開梱、TCPデータグラムモードをサポートしています 

ネットワーク通信プログラムASIOは良い選択ですが、ASIO自体は、彼がそのような対処しなければならなかった関数の集合である「とは、データを送受信するよう通信スレッドプール管理、接続、およびライフサイクル管理、マルチスレッド同期保護。」の開発とC ++ したがってASIO包装の層が大きくASIOの使用を簡素化していました。コードは、C ++ 17関連機能を使用し、それだけでC ++ 17以上で使用することができます。

あなたはhttpまたはWebSocketの機能を使用する必要がある場合、あなたはブーストライブラリを使用する必要がありますので、HTTPよりも少ないが、独立したASIOに直接使用されている場合、ブースト::獣に使用されているHTTPのWebSocket部分と。このスイッチのASIO_STANDALONEマクロ定義はconfig.hppのことで、ブースト:: ASIO ASIOスタンドアロンまたは使用中に使用して提供することができます。

テンプレートプログラミングを多用するCRTPコード(CRTPと仮想および静的を使用せずに多型を達成するため)ので、コンパイラは時間がかかりますが、効率が比較的良い点です。


githubの住所 https://github.com/zhllxt/asio2

クラウドコード住所 https://gitee.com/zhllxt/asio2

ASIOに基づくネットワークプログラミング、その上のTCP、UDP、HTTP、RPC、SSLとのサポートのためのオープンソースのクロスプラットフォームのC ++ライブラリ。

  • その上でTCP、UDP、HTTP、WebSocketを、RPC、ICMP、SERIAL_PORTとはサポートしています。
  • それは信頼性の高いUDP(ベースKCP)、サポートのSSLをサポートし、SSL証明書は、メモリのサポート文字列からロードされます。
  • 機能をアンパックTCP支援データ(指定された区切り文字が自動的にデータをアンパック、受信したユーザデータは、完全なパケットを確実にするためである)、TCPデータグラムモード(類似のWebSocket)を実装します。
  • サポートは、Windows、Linux、32、64;
  • 依存ASIO(独立:: ASIO ASIOをブーストまたは、所望であれば、HTTP機能が向上しなければならないことができる:: ASIO)、C ++ 17に依存します。
  • コンパイルすることなく、ソース・コード・レベルへのリンクをコードヘッダーファイルを使用して、HPPの方法は、単にプロジェクトがASIO2ディレクトリパスを含める加え含む、次いでソースの#includeで<asio2 / asio2.hpp>ヘッダーを含むことができます。
  • デモディレクトリには、様々な方法を使用して、(作成したVS2017のプロジェクトに基づく)の例の多数のプロジェクトが含まれている、サンプルコードを参照してください。

TCP:

サーバー:

asio2 :: tcp_serverサーバ。
server.bind_recv([&サーバ(STD :: shared_ptrの<asio2 :: tcp_session>&session_ptr、STD :: string_view S)
{ 
    session_ptr-> NO_DELAY(TRUE); 

    のprintf( "RECV:%のU字%* Sの\ n"。 (符号なし)s.size()、(INT)s.size()、s.data()); 
    session_ptr->送信(S、[](スタンダード:: size_tのBYTES_SENT){}); 
})bind_connect ([&サーバ(オート&session_ptr)
{ 
    のprintf( "クライアント入力:%S%U%sの%U \ n"、
        。session_ptr-> REMOTE_ADDRESS()c_str()、session_ptr-> REMOTE_PORT()、
        session_ptr-> local_address ().c_str()、session_ptr-> LOCAL_PORT()); 
})bind_disconnect([&サーバ(オート&session_ptr)。
{ 
    のprintf( "クライアント休暇:%S%U%S \ n"は、 
        session_ptr-> REMOTE_ADDRESS()c_str()。
        session_ptr-> REMOTE_PORT()、ASIO2 :: LAST_ERROR_MSG()c_str());. 
}); 
server.start( "0.0.0.0"、8080); 
//server.start("0.0.0.0」、8080、 ' \ N「); //プレス\ nは自動解凍(任意の文字を指定することができます)
//server.start("0.0.0.0 "8080、" \ rを\ n「は); //プレス\ rをする\ nは自動解体パッケージは、(任意の文字列を指定できます)
//server.start("0.0.0.0」、8080、match_role( '#')); //自動開梱match_roleによって指定されたルール(デモコードをmatch_role参照)(のために)アンパックユーザ定義プロトコル
//server.start("0.0.0.0」、8080、ASIO :: transfer_exactly(100))を、固定の100バイトの//すべての受信
//server.start("0.0 .0.0」、8080、asio2 :: use_dgram ); // TCP データグラムモードに関係なく、データ送信は、パケット全体のデータの対応する長さの両方を受信する必要がどのくらいの

  

クライアント:

asio2 :: tcp_clientクライアント。
client.bind_connect([b](ASIO :: ERROR_CODE EC)
{ 
    IF(asio2 :: get_last_error())
        のprintf( "失敗を接続する:%D%S \ n"は、asio2 :: last_error_val()、asio2 :: LAST_ERROR_MSG( ).c_str()); 
    他の
        printf関数( "成功を接続:%sの%をuがします\ n"、client.local_address()c_str()、client.local_port());。

    client.send( "<abcdefghijklmnopqrstovuxyz0123456789>"); 
。})bind_disconnect([](ASIO :: ERROR_CODE EC)
{ 
    ( "切断:%D%S \ n"は、asio2 :: last_error_val()、asio2 :: LAST_ERROR_MSG()c_str())のprintf; 
})。 bind_recv([b](STD :: string_viewのSV)
{ 
    のprintf( "RECV:%のU%* Sの\ n"、(符号なし)sv.size()、(INT)sv.size()、sv.data( ));
 
    //.Bind_recv(on_recv)グローバル関数バインド// 
    //.bind_recv(std::bind(&listener::on_recvを、&​​LIS、STD ::プレースホルダ :: _ 1))// 詳細については、バインドメンバ関数を(してくださいデモを見るコード)
    //.bind_recv(&listener::on_recv、LIS)//メンバ関数をバインドするオブジェクトを参照することにより、LIS(詳細については、デモ・コードを参照してください)
    //.bind_recv(&listener::on_recv、&LIS)//プレス(詳細については、デモ・コードを参照してください)メンバ関数をバインドするオブジェクトへのポインタLIS 
    ; 
client.async_start(「0.0.0.0」、8080); //非同期接続サーバ
//client.start("0.0.0.0」、8080) ; //同期接続サーバ
//client.async_start("0.0.0.0」、8080、 '\ nは '); // プレス\ nは自動解凍(任意の文字を指定することができます)
//client.async_start("0.0。 0.0 "8080、" \ R \ n "); // プレス\ rをする\ n自動アンパック(任意の文字列であってもよい)
//client.async_start("0.0.0.0"、8080、match_role); //プレス自動的に指定されたルール(デモコードをmatch_role参照)(ユーザ定義開梱するためのプロトコル)をアンパックmatch_role 
//client.async_start("0.0.0.0"、8080、ASIO :: transfer_exactly(100)) ; //すべての100のバイトは、固定受信
//client.start("0.0.0.0を」、8080、asio2 :: use_dgram); // TCPデータグラムモードに関係なく、データ送信は、パケット全体のデータの両方に対応する長さを受信する必要がどのくらいの

  

UDP:

サーバー:

::サーバーASIO2 udp_server; 
// ...バインドリスナー(デモ・コードを参照してください)
server.start( "0.0.0.0"、8080); //通常のUDPの
//server.start("0.0.0.0」、 8080、asio2 :: use_kcp); //信頼性の高いUDP

  

クライアント: 

:: udp_clientクライアントASIO2; 
// ...バインドリスナー(デモ・コードを参照してください)
client.start( "0.0.0.0"、8080); 
//client.async_start("0.0.0.0」、8080、ASIO2: :use_kcp); //信頼性の高いUDP

  

RPC:

サーバー:

::サーバーASIO2 rpc_server; 
// ...バインドリスナー(デモ・コードを参照してください)
A A; // Aが定義され、デモ・コードを参照してください
(、 "追加"を追加)server.bindを ; // バインドRPCグローバル関数
server.bind( "MUL"、&A :: MUL、A); // RPC結合メンバー関数
server.bind( "CAT"、[・ ](CONSTのstd ::文字列と、CONSTのstd ::文字列&B) {+ Bを返す;}) ; // バインドラムダ発現
server.bind( "GET_USER"、&A :: GET_USER、A); // 参照によりメンバ関数を(結合)
server.bind( "del_user"、 &A :: del_user、&A) ; // メンバ関数(ポインタによって)結合し
//server.start("0.0.0.0」、8080、ASIO2 :: use_dgramを); //下にある支持のRPCとしてTCPデータ通信モードを使用しますサーバを起動すると、パラメータuse_dgram使用しなければならないとき
server.startを(「0.0.0.0」は、8080) ; // RPC通信用WebSocketとして使用することは、(コード用WebSocketを選択する必要があり、ファイルのrcp_server.hpp端)のサポートの基礎となります

  

クライアント: 

:: rpc_clientクライアントASIO2; 
// ...バインドリスナー(デモ・コードを参照してください)
//client.start("0.0.0.0」、8080、ASIO2 :: use_dgramに); // RPCとTCPデータグラムモードを使用しますコミュニケーション基礎となるサポート、パラメータuse_dgram使用する必要があり、サーバの起動時に
client.startを( "0.0.0.0"、8080) ; //は、 RPC通信用WebSocket基礎となるサポートとして使用
ASIO :: ERROR_CODE EC; 
//同期呼び出しRPC関数
int型の合計= Client.call <整数>(EC、クロノ:: ::秒STD(3)、 "追加"、。11、2); 
のprintf( "SUM:ERR%D:D %% S \ N-"、SUM、EC。値()、ec.message()c_str());. 
//非同期RPCコール機能は、最初のパラメータは、呼が完了したコールバック関数であるか、またはタイムアウトコールバック関数は、自動的に呼び出された場合、タイムアウトまたは他のエラーであり、
// ECは、第2のパラメータラムダ式は、型指定する必要があり、種類が指定されていないが返さasync_call、エラー・コードに格納されている
client.async_call([](ASIO :: ERROR_CODE EC、V int型)
{ 
    のprintf(「SUMを: D ERR%:%S%D \ N- "V、ec.value()、ec.message()c_str());. 
}、"追加」、10、20)。
//ここasync_call自動車の第二のタイプであってもよいラムダ式パラメータの戻り型を示し
client.async_call <整数>([](ASIO :: ERROR_CODE EC、オートV)
{ 
    %D:のprintf(「SUM ERR:%S%D \ N- "V、ec.value()、ec.message()c_str());. 
}、"追加」、12は、21である); 
//の戻り値は、ユーザ定義のデータ型(ユーザ定義型のデモコードを参照してください)
ユーザUがClient.call <ユーザー>(EC、 "GET_USERを")=; 
のprintf( "%のSの%のD"、u.name.c_str()、u.age); 
のため(オート&[K、V]:u.purview)
{ 
    のprintf( "%S%D"、K、v.c_str()); 
} 
のprintf( "\ N-"); 

u.name "はHanmeimeiを" =; 
U = .age((INT)時間(nullptr A))100%; 
u.purview = {{10}、20は{、} "SET"を"GET"}; 
//戻り値空隙をRPC関数であれば、ユーザコールバック関数への唯一のパラメータは
、クライアント。async_call([](ASIO :: ERROR_CODE EC) 
{
}、 "del_user"、STD ::移動(U))。

  

HTTP和のWebSocket:

デモのサンプルコードセクションのhttpのWebSocketを参照してください。

ICMP:

デモのサンプルコードのpingテストの項を参照してください。

シリアル:

デモのサンプルコード、シリアルポートのセクションを参照してください。

おすすめ

転載: www.cnblogs.com/zhllxt/p/10977764.html