2017-06-29 21 views
6

Tôi đang cố gắng chuyển ứng dụng dành cho máy tính để bàn của mình được viết bằng C và C++ sang nền tảng webassembly và đang điều tra xem có thể nào không. Một trong những điều quan trọng mà ứng dụng thực hiện là giao tiếp bằng cách gửi và nhận tin nhắn UDP. Tôi đã thực hiện tối thiểu UDP khách hàng mà chỉ tạo ra ổ cắm UDP và gửi các gói tin đến máy chủ (được xây dựng nguyên bản và đang chạy như thực thi riêng biệt tại cùng một máy). socket, bind và sendto API không trả về lỗi và mọi thứ có vẻ hoạt động nhưng không có thông điệp nào nhận được ở phía máy chủ và wireshark cho thấy không có hoạt động nào trên cổng đó.Ổ cắm UDP tại webassembly

Ổ cắm UDP chỉ được lưu trữ tại cổng webassembly libc hoặc được thực hiện trên một số kết nối chuẩn web (ví dụ: WebRTC)?

Mã khách hàng bên dưới. Tôi đã kiểm tra bản dựng gốc đang hoạt động đúng cách.

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

Tôi làm theo hướng dẫn từ http://webassembly.org/getting-started/developers-guide/ để xây dựng và chạy nó.

Cảm ơn trước vì bất kỳ trợ giúp hoặc đầu mối nào!

+0

WetherWark Wethereshark có thể nắm bắt các gói trên giao diện loopback (tức là gửi gói đến cùng một máy) phụ thuộc vào nền tảng và lựa chọn giao diện gói sniffer của bạn. Trên Windows + winpcap, ví dụ, nó chỉ là không thể. Bạn đang sử dụng nền tảng nào? – tofro

+0

Có, tôi đang sử dụng Windows và tôi sẽ thử đưa máy chủ vào máy an toàn hơn. Cảm ơn bạn! – roof

+0

Tôi đã thử gửi gói đến máy chủ từ xa. Bây giờ wireshark cho thấy các gói tin gửi đi nếu tôi chạy ứng dụng khách được xây dựng nguyên bản và không hiển thị gì để xây dựng webassembly. – roof

Trả lời

0

Tôi đã tìm thấy cách cổng UDP được triển khai tại webassembly. Trên thực tế, chúng được mô phỏng bởi websockets. Nó có thể sẽ hoạt động nếu cả máy khách và máy chủ đều là các tập hợp web, nhưng máy chủ của tôi được xây dựng nguyên bản. Như wasm không hỗ trợ liên kết động, tất cả các mã (bao gồm cả thực hiện libc) được đóng gói vào một tập tin JS, là chúng ta có thể tìm thấy UDP sendto thực hiện:

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

Bất cứ điều gì mà chạy trong trình duyệt sẽ không cung cấp cho bạn bản địa truy cập ổ cắm và tôi nghi ngờ rằng các nhà cung cấp trình duyệt sẽ phản đối mạnh mẽ bất kỳ truy cập nào như vậy vì nó là một vi phạm bảo mật tiềm năng.

Có lẽ vì ngày càng nhiều ứng dụng gốc di chuyển đến web do sự khác biệt về hiệu suất co lại do webassembly và các sáng kiến ​​tương tự sẽ làm cho chúng thay đổi lập trường của chúng, nhưng cho đến lúc đó, bất cứ điều gì muốn điều khiển socket trực tiếp sẽ vẫn là ứng dụng gốc .

+0

Vâng, tôi hy vọng rằng có một số thực hiện ổ cắm UDP thông minh trên đầu trang của WebRTC hoặc thậm chí trên đầu trang của hỗ trợ thực nghiệm của [dự thảo W3C] (https://www.w3.org/TR/tcp-udp-sockets). – roof

+0

Bạn nghĩ rằng họ sẽ cấp quyền truy cập cho UDP vì nó có ích cho một số thứ như âm thanh thời gian thực: \ – rogerdpack

+0

@AdnanY: ứng dụng khách gốc có thể được khởi chạy theo cách tương tự như các ứng dụng JavaScript và chúng cung cấp ổ cắm thô. – user2284570

Các vấn đề liên quan