Networking

Emscripten-kompilierte Anwendungen verfügen über eine Reihe von Möglichkeiten, sich mit Online-Servern zu verbinden. Überprüfen Sie die Unterthemen hier, um mehr über die verschiedenen verfügbaren Strategien zu erfahren.

Wenn Sie mit Netzwerkkonzepten vertraut sind, die von verschiedenen Web-APIs wie XmlHttpRequest, Fetch, WebSockets und WebRTC bereitgestellt werden, können Sie schnell loslegen, indem Sie Ihr vorhandenes Wissen nutzen: Durch Aufrufe von C/C++-Code an JavaScript (siehe Abschnitt „Connecting C++ and JavaScript“) können Sie Netzwerkverbindungen herstellen, indem Sie reguläres JavaScript schreiben. Für C/C++-Entwickler bietet Emscripten einige Ansätze, die hier beschrieben werden.

Emscripten WebSockets API

Die WebSockets API bietet verbindungsorientierte, nachrichtenbasierte, bidirektionale, asynchrone Netzwerkkommunikation für den Browser. Sie ist die der Web-TCP am nächsten kommende Verbindung, auf die Websites zugreifen können; direkter Zugriff auf TCP-Sockets ist von Webbrowsern aus nicht möglich.

Emscripten bietet eine Passthrough-API für den Zugriff auf die WebSockets-API aus C/C++-Code. Dies ist nützlich für Entwickler, die es vorziehen, keinen JavaScript-Code zu schreiben oder sich mit der Interoperabilität zwischen C/C++- und JavaScript-Sprache zu befassen. Details finden Sie in der System-Include-Datei <emscripten/websocket.h>. Ein Vorteil, den die Emscripten WebSockets API gegenüber dem manuellen WebSockets-Zugriff in JavaScript bietet, ist die Möglichkeit, den Zugriff auf ein WebSocket-Handle über mehrere Threads zu teilen, was von Grund auf neu zu entwickeln zeitaufwändig sein kann.

Um die Emscripten WebSockets API zu verwenden, müssen Sie sie mit der Linker-Direktive -lwebsocket.js einbinden.

Emulierte POSIX TCP Sockets über WebSockets

Wenn Sie vorhandenen TCP-Netzwerkcode in C/C++ haben, der die Posix Sockets API verwendet, versucht Emscripten standardmäßig, solche Verbindungen stattdessen über das WebSocket-Protokoll zu emulieren. Damit dies funktioniert, müssen Sie serverseitig etwas wie WebSockify verwenden, um dem TCP-Server-Stack den Empfang eingehender WebSocket-Verbindungen zu ermöglichen. Diese Emulation ist derzeit nicht sehr vollständig, es ist wahrscheinlich, dass Sie auf Probleme stoßen werden und den Code an die Einschränkungen dieser Emulation anpassen müssen.

Dies ist der Standard-Build-Modus für Emscripten. Verwenden Sie das Linker-Flag -sWEBSOCKET_URL oder Module['websocket']['url'], um die zu verbindende WebSocket-URL anzugeben, und das Linker-Flag -sWEBSOCKET_SUBPROTOCOL oder Module['websocket']['subprotocol'], um den Verbindungstyp ('binary' oder 'text') zu steuern.

Volle POSIX Sockets über WebSocket Proxy Server

Emscripten bietet ein natives POSIX Sockets Proxy-Server-Programm, das sich im Verzeichnis tools/websocket_to_posix_proxy/ befindet und vollen Zugriff auf die POSIX Sockets API von einem Webbrowser aus ermöglicht. Diese Unterstützung funktioniert, indem alle POSIX Sockets API-Aufrufe vom Browser an den Emscripten POSIX Sockets Proxy-Server (durch transparente Nutzung der WebSockets API) weitergeleitet werden, und der Proxy-Server führt dann die nativen TCP/UDP-Aufrufe im Namen der Seite aus. Dies ermöglicht einer Webbrowser-Seite, vollständige TCP- & UDP-Verbindungen auszuführen, als Server eingehende Verbindungen zu akzeptieren und Hostnamen-Lookups sowie Reverse-Lookups durchzuführen. Da alle API-Aufrufe einzeln proxied werden, kann diese Unterstützung langsam sein. Diese Unterstützung ist hauptsächlich nützlich für die Entwicklung von Testinfrastrukturen und das Debugging.

Die folgenden POSIX-Socket-Funktionen werden auf diese Weise proxied
  • socket(), socketpair(), shutdown(), bind(), connect(), listen(), accept(), getsockname(), getpeername(), send(), recv(), sendto(), recvfrom(), sendmsg(), recvmsg(), getsockopt(), setsockopt(), getaddrinfo(), getnameinfo().

Die folgenden POSIX-Socket-Funktionen werden derzeit nicht proxied (und funktionieren nicht)
  • poll(), close() (stattdessen shutdown() verwenden), select()

Um POSIX-Sockets-Proxying zu verwenden, verlinken Sie die Anwendung mit den Flags -lwebsocket.js -sPROXY_POSIX_SOCKETS -pthread -sPROXY_TO_PTHREAD. Das heißt, POSIX-Sockets-Proxying baut auf der Emscripten WebSockets-Bibliothek auf und erfordert Multithreading sowie das Proxying der Anwendungs- main() an einen pthread.

Ein Beispiel dafür, wie der POSIX Sockets Proxy-Server in einem Emscripten Client-Programm funktioniert, finden Sie in der Datei test/websocket/tcp_echo_client.c.

XmlHttpRequests und Fetch API

Für HTTP-Übertragungen können die im Browser integrierte XmlHttpRequest (XHR) API und die neuere Fetch API verwendet werden. Diese können direkt über JavaScript aufgerufen werden. Emscripten bietet auch Passthrough-APIs zur Durchführung von HTTP-Anfragen. Weitere Informationen finden Sie in der C-API emscripten_async_wget*() und der Emscripten Fetch API.

WebRTC und UDP

Direkte UDP-Kommunikation ist in Browsern nicht verfügbar, aber als nahe Alternative bietet die WebRTC-Spezifikation einen Mechanismus zur UDP-ähnlichen Kommunikation mit WebRTC Data Channels. Derzeit bietet Emscripten keine C/C++-API für die Interaktion mit WebRTC.