オープンソースの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テストの項を参照してください。
シリアル:
デモのサンプルコード、シリアルポートのセクションを参照してください。