2017-06-29 14 views
6

Próbuję przenieść moją aplikację komputerową napisaną w języku C i C++ na platformę webassembly i sprawdzam, czy jest ona w ogóle możliwa. Jedną z ważnych rzeczy, którą aplikacja obsługuje, jest wysyłanie i odbieranie wiadomości UDP. Zaimplementowałem minimalnego klienta UDP, który właśnie tworzy gniazdo UDP i wysyła pakiety na serwer (który jest wbudowany i działa jako oddzielny plik wykonywalny na tym samym komputerze). funkcje API socket, bind i sendto nie zwracają błędu i wszystko działa poprawnie, ale po stronie serwera nie są odbierane żadne wiadomości, a wireshark nie pokazuje żadnej aktywności na tym porcie.Gniazdo UDP w zespole internetowym

Czy gniazdo UDP jest tylko przygniecione do portu libc do tworzenia stron WWW, czy jest implementowane jako część standardowego połączenia internetowego (np. WebRTC)?

Kod klienta znajduje się poniżej. Sprawdziłem, czy natywna kompilacja działa poprawnie.

#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; 
} 

I przestrzegać instrukcji http://webassembly.org/getting-started/developers-guide/ zbudować i uruchomić go.

Z góry dziękuję za pomoc lub wskazówki!

+0

Wether Wireshark jest w stanie przechwytywać pakiety w interfejsie sprzężenia zwrotnego (tj. Wysyłanie pakietów do tego samego komputera) w zależności od platformy i wyboru interfejsu sniffera pakietów. Na przykład na Windows + winpcap, to po prostu niemożliwe. Na jakiej jesteś platformie? – tofro

+0

Tak, pracuję w systemie Windows i spróbuję umieścić serwer na innej maszynie. Dziękuję Ci! – roof

+0

Próbowałem wysłać pakiety do zdalnego hosta. Teraz wireshark pokazuje pakiety wychodzące, jeśli uruchomię natywnie wbudowaną aplikację kliencką i nic nie wyświetli dla kompilacji webassembly. – roof

Odpowiedz

0

Znalazłem sposób, w jaki gniazda UDP są implementowane w zespole. W rzeczywistości są one emulowane przez websockets. Prawdopodobnie działałoby, gdyby zarówno klient, jak i serwer były składnikami sieci, ale mój serwer jest zbudowany natywnie. Jak wasm nie obsługuje dynamiczne łączenie, cały kod (łącznie libc realizacji) jest dołączone do jednego pliku JS, w którym można znaleźć UDP SENDTO realizacji:

// 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

Wszystko, co działa w przeglądarce nie da ci rodzimy dostęp do gniazd i podejrzewam, że dostawcy przeglądarek będą stanowczo sprzeciwiać się takiemu dostępowi, ponieważ jest to potencjalne naruszenie bezpieczeństwa.

Być może w miarę jak coraz więcej rodzimych aplikacji przenosi się do sieci, ponieważ różnica wydajności zmniejsza się z powodu tworzenia stron WWW, a podobne inicjatywy spowodowałyby zmianę ich nastawienia, ale do tego czasu wszystko, co wymaga bezpośredniej kontroli gniazd, musi pozostać natywną aplikacją .

+0

Cóż, miałem nadzieję, że na WebRTC istnieje sprytne wdrożenie UDP lub nawet eksperymentalna obsługa [tego projektu W3C] (https://www.w3.org/TR/tcp-udp-sockets). – roof

+0

Można by pomyśleć, że dadzą jakiś dostęp do UDP, ponieważ jest to przydatne w przypadku niektórych rzeczy, takich jak dźwięk w czasie rzeczywistym: \ – rogerdpack

+0

@AdnanY: aplikacje rodzimych klientów mogą być uruchamiane w podobny sposób jak aplikacje JavaScript i dostarczają surowe gniazda. – user2284570