2017-06-19 11 views

Antwort

4

Der Beispielcode Verbindung zum öffentlichen Echo Web Socket Server, Nachricht senden, Antwort empfangen und trennen.

JavaScript-Code bietet Funktionen für den Web-Socket und die Protokollierung im Webassembly-Code.

Hauptprogramm Logik schrieb in C, die dann kompilieren, um WMF-Datei.

Ergebnisse können in js Konsole gesehen werden.

Zusammenstellung:

EMCC ws_test.c -o ws_test.html -O1 es wasm = 1 es ONLY_MY_CODE = 1 es EXPORTED_FUNCTIONS = "[ '_ GetBuffer', '_ wsOnMessage', '_wsOnOpen', '_test'] "

Ergebnisdatei ws_test.wasm ist winzig. (431 Bytes)

die wasm Um zu überprüfen, können dekompiliert zu readably s-Ausdrücke:
wasm2wast ws_test.wasm -o ws_test.wast

ws_test.c

extern void wsConnect(char *address); 
    extern void wsSend(char *message); 
    extern void wsClose(); 
    extern void print(char *message); 

    char buffer[100]; 
    char *getBuffer(){ return buffer; } 

    void wsOnMessage(){ 
     print("received message"); 
     print(buffer); 
     wsClose(); 
     print("connection closed"); 
    } 

    void wsOnOpen(){ 
     print("connected"); 
     wsSend("Hello WebAssembly !"); 
    } 


    void test(){ 
     wsConnect("ws://echo.websocket.org"); 
     print("connecting..."); 
    } 

ws_test.html

 <script> 

     var webSocket; 
     const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }); 
     const buffer = new Uint8Array(memory.buffer); 
     var exports; 

     function toJsStr(offset){ 
      var s=""; 
      for(;;){ 
       var b = buffer[offset++]; 
       if(b == 0) 
        return s; 
      s += String.fromCharCode(b); 
     } 
     } 
     function toCStr(str){ 
     var offset = exports._getBuffer(); 
     for (var i = 0; i < str.length; ++i) { 
      buffer[offset++] = str.charCodeAt(i); 
     } 
     buffer[offset] = 0; 
     } 

     function print(offset){ 
     console.log(toJsStr(offset)); 
     } 

     function wsConnect(offset){ 
     webSocket = new WebSocket(toJsStr(offset)); 
     webSocket.onopen = function(){ 
      console.log("Socket is open"); 
      exports._wsOnOpen(); 
     }; 

     webSocket.onmessage = function (evt){ 
      var msg = evt.data; 
      console.log("Message is received..."); 
      toCStr(msg); 
      exports._wsOnMessage(); 
     }; 
     } 

     function wsClose(){ 
     webSocket.close(); 
     } 

     function wsSend(offset){ 
     webSocket.send(toJsStr(offset)); 
     } 

     fetch('ws_test.wasm').then(response => 
     response.arrayBuffer() 
    ).then(bytes => { 
      var imports = {}; 
      imports.env = {}; 
      imports.env.memory = memory; 
      imports.env.memoryBase = 0; 
      imports.env.table = new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' }); 
      imports.env.tableBase = 0; 
      imports.env._print = print; 
      imports.env._wsConnect = wsConnect; 
      imports.env._wsSend = wsSend; 
      imports.env._wsClose = wsClose; 


      return WebAssembly.instantiate(bytes, imports); 
     } 
    ).then(module => { 
      exports = module.instance.exports; 

      exports._test(); 
      } 
    ); 
     </script> 

hier verwendeter Compiler-Flag ‚ONLY_MY_CODE = 1‘, so wird das Ergebnis wasm sehr klein sein, und nicht an Standardbibliotheken

Dieser Modus bequem verbunden werden, wenn das Modul für arithmetische Berechnungen verwendet wird.

So können Sie nicht im Modus verwenden: printf, malloc/free, strcpy!

Wenn Sie String-Funktionen verpasst haben: strcpy, strcat, strlen ... - Sie können die Quellcode-Funktionen hinzufügen.

Aber wenn Sie zum Beispiel malloc/free besser Link Standard-C-Bibliotheken benötigen.

0

Es ist nur Demo, keine Produktion.

  • toJsStr (Offset) und toCStr (str) könnten UTF-8 (derzeit nur ASCII)

  • toCStr unterstützen sollte nicht nur Offset-Puffer verwenden, aber auch die Puffergröße Pufferüberlauf zu verhindern.

  • Missed Kommunikationsfehlerbehandlung: web Buchse Rückrufe verwendet werden soll: onerror(), OnClose()