MicroTCPはTCP/IPネットワークスタックです。私は学習演習として構築し始めました。それは単なる趣味のプロジェクトであり、最小限でありながら完全な実装になることを目的としています。
現時点では、MicroTCPはARP(RFC 826、完全)、IPv4(断片化なし)、ICMP(Pingに応答するのに必要な最小)、TCP(完全ですが応力テストではありません)を実装します。 「完全」は「完全に準拠」として意図されるべきではなく、すべての主要な機能の進歩の尺度として意図されるべきであることに注意してください。たとえば、ローカルネットワーク上のHTTPトラフィックを処理するのに十分なほど完全です(詳細を知るために、例/microhttpをご覧ください)。
MicroTCPは、OSのネットワークスタックと一緒にWindowsとLinuxで実行できます。ネットワークトラフィックをMicroTCPにルーティングするには、実行しているプロセスは、独自のIPアドレスを持つ仮想ホストとして動作します。これは、Linuxに組み込まれており、Windowsにインストールする必要があるTAPデバイスを使用して行われます。 MicroTCPをマイクロコントローラーで実行するように適応するのは非常に簡単ですが、まだ試していません。夢は、STM32ボードから私のブログにサービスを提供することです!
Windowsにいる場合は、OpenVPNが提供するTAPドライバーをインストールし、仮想NICをインストールして、MicroTCPが開始時に接続できるようにする必要があります。ソースからプロジェクトを構築するには、サブモジュールでリポジトリをクローニングしたことを確認してください
git clone https://github.com/cozis/microtcp.git --recursiveそして、実行します
makeそれが機能するには、 makeとcmake両方が必要です。すべてがうまくいけば、ライブラリファイルlibtuntap.a 、 libmicrotcp.aおよびヘッダーファイルtuntap.h 、 tuntap-export.h 、 microtcp.h in out/ 。
MicroTCPは、ネットワークプログラマーがよく知っている通常のソケットインターフェイスを使用しています。主な違いは、ネットワークスタックを明示的にインスタンス化してハンドルを渡す必要があることです。
基本的な使用法を示すシンプルなエコーサーバーは次のとおりです。
#include <microtcp.h>
int main ( void )
{
microtcp_t * mtcp = microtcp_create ( "10.0.0.5" , "10.0.0.4" , NULL , NULL );
if ( mtcp == NULL )
return -1 ; // Couldn't create MicroTCP instance
uint16_t port = 8081 ;
microtcp_socket_t * server = microtcp_open ( mtcp , port );
if ( server == NULL ) {
microtcp_destroy ( mtcp );
return -1 ;
}
while ( 1 ) {
microtcp_socket_t * client = microtcp_accept ( server );
if ( client == NULL )
break ;
char buffer [ 1024 ];
int num = microtcp_recv ( client , buffer , sizeof ( buffer ));
if ( num > 0 ) {
microtcp_send ( client , "echo: " , 6 );
microtcp_send ( client , buffer , num );
}
microtcp_close ( client );
}
microtcp_close ( server );
microtcp_destroy ( mtcp );
return 0 ;
}これは理解するのがかなり簡単なはずです。 1つは、BSDのsocket+bind+listenリスニングTCPサーバーをセットアップするにつれて、 microtcp_openが動作することです。
スタックをセットアップする方法は複数あります。これは、IP 10.0.0.5/24でホストOSに仮想ネットワークの緊急を作成し、10.0.0.4/24のMicroTCPプロセスの仮想ホストを作成するmicrotcp_createです。仮想NICでWiresharkを開いて、ホストとプロセスの間のトラフィックを検査できます。
また、 microtcp_create_using_callbacksを使用してスタックを構成することもできます。これにより、入力L2フレームを明示的に提供し、バッファーでフレームを受信できます。これは、マイクロコントローラーで実行するスタックを構成する方法です。
MicroTCPの各インスタンス(コールバックを考慮せずに)は他のインスタンスから完全に分離されているため、特定のコールバック実装で許可されている場合は、好きなだけインスタンスを作成できます。
まだテスト骨間構造はありません。私がそれをテストする方法は、HTTPまたはエコーサーバーをセットアップし、Wiresharkを使用して起こったことをキャプチャしながら何かが壊れるまでそれを強調することです。