ネットワーク

Emscripten でコンパイルされたアプリケーションには、オンラインサーバーに接続するためのいくつかの方法があります。利用可能なさまざまな戦略については、ここにあるサブトピックを確認してください。

XmlHttpRequest、Fetch、WebSockets、WebRTC など、さまざまな Web API によって提供されるネットワーキングの概念に精通している場合は、すでに知っていることを活用してすぐに開始できます。C/C++ コードから JavaScript を呼び出すことで(「C++ と JavaScript の接続」セクションを参照)、通常の JavaScript を記述することで、ネットワーク接続を確立できます。C/C++ 開発者向けに、Emscripten はここで説明するいくつかのアプローチを提供します。

Emscripten WebSockets API

WebSockets API は、ブラウザーへの接続指向メッセージフレーム双方向非同期ネットワーキング通信を提供します。Web サイトがアクセスできる Web 上の TCP に最も近いものであり、Web ブラウザーから TCP ソケットに直接アクセスすることはできません。

Emscripten は、C/C++ コードから WebSockets API にアクセスするためのパススルー API を提供します。これは、JavaScript コードを記述したり、C/C++ と JavaScript 言語の相互運用を処理したりすることを避けたい開発者にとって役立ちます。詳細については、システムインクルードファイル <emscripten/websocket.h> を参照してください。JavaScript での手動 WebSockets アクセスと比較して、Emscripten WebSockets API が提供する 1 つの利点は、複数のスレッド間で WebSocket ハンドルへのアクセスを共有できることです。これは、ゼロから開発するには時間がかかる可能性があります。

Emscripten WebSockets API をターゲットにするには、-lwebsocket.js リンカーディレクティブを使用してリンクする必要があります。

WebSockets 上のエミュレートされた POSIX TCP ソケット

Posix Sockets API を利用した既存の TCP ネットワーキングコードが C/C++ で記述されている場合、Emscripten はデフォルトで、代わりに WebSocket プロトコルを介してこのような接続をエミュレートしようとします。これを機能させるには、サーバー側で WebSockify のようなものを使用して、TCP サーバー スタックが着信 WebSocket 接続を受信できるようにする必要があります。このエミュレーションは現時点ではあまり完全ではなく、すぐに問題が発生し、このエミュレーションが提供する制限内で動作するようにコードを適応させる必要がある可能性が高くなります。

これは Emscripten のデフォルトのビルドモードです。接続先の WebSocket URL を指定するには、リンカーフラグ -sWEBSOCKET_URL または Module['websocket']['url'] を使用し、接続タイプ ('binary' または 'text') を制御するには、リンカーフラグ -sWEBSOCKET_SUBPROTOCOL または Module['websocket']['subprotocol'] を使用します。

WebSocket プロキシサーバー上のフル POSIX ソケット

Emscripten は、ディレクトリ tools/websocket_to_posix_proxy/ にあるネイティブ POSIX ソケットプロキシサーバープログラムを提供しており、Web ブラウザーからのフル POSIX ソケット API アクセスを可能にします。このサポートは、ブラウザーからのすべての POSIX ソケット API 呼び出しを Emscripten POSIX ソケットプロキシサーバーに(WebSockets API の透過的な使用を介して)プロキシすることで機能します。プロキシサーバーは、ページの代わりにネイティブ TCP/UDP 呼び出しを実行します。これにより、Web ブラウザーページは、完全な TCP および UDP 接続を実行し、着信接続を受け入れるためのサーバーとして機能し、ホスト名の検索と逆検索を実行できます。すべての API 呼び出しが個別にプロキシされるため、このサポートは遅くなる可能性があります。このサポートは、主にテストインフラストラクチャの開発とデバッグに役立ちます。

次の POSIX ソケット関数がこの方法でプロキシされます
  • socket(), socketpair(), shutdown(), bind(), connect(), listen(), accept(), getsockname(), getpeername(), send(), recv(), sendto(), recvfrom(), sendmsg(), recvmsg(), getsockopt(), setsockopt(), getaddrinfo(), getnameinfo()

次の POSIX ソケット関数は現在プロキシされていません(および機能しません)
  • poll(), close() (代わりに shutdown() を使用), select()

POSIX ソケットプロキシを使用するには、アプリケーションをフラグ -lwebsocket.js -sPROXY_POSIX_SOCKETS -pthread -sPROXY_TO_PTHREAD でリンクします。つまり、POSIX ソケットプロキシは Emscripten WebSockets ライブラリの上に構築され、マルチスレッドとアプリケーションの main() を pthread にプロキシする必要があります。

Emscripten クライアントプログラムで POSIX ソケットプロキシサーバーがどのように機能するかの例については、ファイル test/websocket/tcp_echo_client.c を参照してください。

XmlHttpRequests および Fetch API

HTTP 転送の場合、ブラウザーに組み込まれている XmlHttpRequest (XHR) API と新しい Fetch API を使用できます。これらは JavaScript から直接アクセスできます。Emscripten は、HTTP リクエストを実行するためのパススルー API も提供します。詳細については、emscripten_async_wget*() C API と Emscripten Fetch API を参照してください。

WebRTC および UDP

ブラウザーでは直接 UDP 通信は利用できませんが、近い代替手段として、WebRTC 仕様は、WebRTC データチャネルを使用して UDP のような通信を実行するメカニズムを提供します。現在、Emscripten は WebRTC と対話するための C/C++ API を提供していません。