2017-06-29 30 views
6

私はCとC++で書かれた私のデスクトップアプリケーションをwebassemblyプラットフォームに移植しようとしており、可能であるかどうか調べています。アプリケーションが行う重要なことの1つは、UDPメッセージを送受信することによって通信することです。私はUDPソケットを作成し、サーバーにパケットを送信する最小限のUDPクライアントを実装しました(これはネイティブに構築され、同じマシンで別々の実行可能ファイルとして実行されています)。ソケット、バインド、sendto APIはエラーを返さず、すべてが正常に動作しているように見えますが、サーバ側ではメッセージが受信されておらず、wiresharkはそのポートで何の動作もしていません。webassemblyのUDPソケット

UDPソケットはwebassembly libc portでスタブされているか、Web標準接続(WebRTCなど)の上に実装されていますか?

クライアントコードは以下のとおりです。ネイティブビルドが適切に動作していることを確認しました。

#include <stdlib.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <unistd.h> 

#define BUFLEN 512 
#define NPACK 100 
#define PORT 9930 

void diep(char *s) 
{ 
    perror(s); 
    exit(1); 
} 

#define SRV_IP "127.0.0.1" 


int main(void) 
{ 
    struct sockaddr_in si_other; 
    int s, i, slen=sizeof(si_other); 
    char buf[BUFLEN]; 

    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
    diep("socket"); 

    memset((char *) &si_other, 0, sizeof(si_other)); 
    si_other.sin_family = AF_INET; 
    si_other.sin_port = htons(PORT); 
    if (inet_aton(SRV_IP, &si_other.sin_addr)==0) { 
    fprintf(stderr, "inet_aton() failed\n"); 
    exit(1); 
    } 

    for (i=0; i<NPACK; i++) { 
    printf("Sending packet %d\n", i); 
    sprintf(buf, "This is packet %d\n", i); 
    if (sendto(s, buf, BUFLEN, 0, (struct sockaddr*)&si_other, slen)==-1) 
     diep("sendto()"); 
    } 

    close(s); 
    return 0; 
} 

私は、http://webassembly.org/getting-started/developers-guide/の指示に従って、ビルドして実行しました。

ご協力いただきありがとうございます。

+0

Wether Wiresharkは、プラットフォームとパケットスニファインターフェイスの選択に応じて、ループバックインターフェイス上のパケットをキャプチャできます(つまり、同じマシンにパケットを送信します)。たとえば、Windows + winpcapでは、これは不可能です。あなたはどんなプラットフォームですか? – tofro

+0

はい、私はWindowsを使用していますが、サーバーをインターネットに接続しようとします。ありがとうございました! – roof

+0

パケットをリモートホストに送信しようとしました。現在wiresharkは、ネイティブにビルドされたクライアントアプリケーションを実行し、webassemblyビルドに何も表示しないと、送信パケットを表示します。 – roof

答えて

0

UDPソケットがwebassemblyでどのように実装されているかを確認しました。実際には、WebSocketによってエミュレートされています。クライアントとサーバーの両方がWebアセンブリであっても、サーバーがネイティブに構築されていると、おそらく動作します。 wasmが動的リンクをサポートしていませんので、(libcの実装を含む)すべてのコードは、1つのJSファイルにバンドルされている、だった私たちは、UDPのsendtoの実装を見つけることができます:ブラウザで実行

// if we're emulating a connection-less dgram socket and don't have 
     // a cached connection, queue the buffer to send upon connect and 
     // lie, saying the data was sent now. 
     if (sock.type === 2) { 
     if (!dest || dest.socket.readyState !== dest.socket.OPEN) { 
      // if we're not connected, open a new connection 
      if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 
      dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); 
      } 
      dest.dgram_send_queue.push(data); 
      return length; 
     } 
     } 
0

ものはあなたにネイティブを与えることはありません私は、ブラウザベンダーが潜在的なセキュリティ違反であるため、そのようなアクセスに強く反対するだろうと考えています。

ウェブアセンブリのためにパフォーマンスの差が縮小され、同様のイニシアチブが彼らの立場を変えてしまうネイティブアプリケーションがウェブに移動するにつれて、おそらく直接ソケット制御を望むものはネイティブアプリ。

+0

さて、私は、WebRTCの上に、あるいは[W3Cドラフト](https://www.w3.org/TR/tcp-udp-sockets)の実験的サポートの上にも、巧妙なUDPソケット実装があることを期待しました。 – roof

+0

リアルタイムオーディオのようなものには便利なので、UDPへのアクセス権はあると思います。\ – rogerdpack

+0

@AdnanY:ネイティブクライアントアプリケーションは、JavaScriptアプリケーションと同様の方法で起動することができ、rawソケットを提供します。 – user2284570