This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
wasm-micro-runtime/samples/socket-api
Wenyong Huang 78b5c5b484
Merge dev/socket into main (#1393)
Implement more socket APIs, refer to #1336 and below PRs:
- Implement wasi_addr_resolve function (#1319)
- Fix socket-api byte order issue when host/network order are the same (#1327)
- Enhance sock_addr_local syscall (#1320)
- Implement sock_addr_remote syscall (#1360)
- Add support for IPv6 in WAMR (#1411)
- Implement ns lookup allowlist (#1420)
- Implement sock_send_to and sock_recv_from system calls (#1457)
- Added http downloader and multicast socket options (#1467)
- Fix `bind()` calls to receive the correct size of `sockaddr` structure (#1490)
- Assert on correct parameters (#1505)
- Copy only received bytes from socket recv buffer into the app buffer (#1497)

Co-authored-by: Marcin Kolny <mkolny@amazon.com>
Co-authored-by: Marcin Kolny <marcin.kolny@gmail.com>
Co-authored-by: Callum Macmillan <callumimacmillan@gmail.com>
2022-09-22 21:46:14 +08:00
..
wasm-src Merge dev/socket into main (#1393) 2022-09-22 21:46:14 +08:00
CMakeLists.txt Merge dev/socket into main (#1393) 2022-09-22 21:46:14 +08:00
README.md Merge dev/socket into main (#1393) 2022-09-22 21:46:14 +08:00

"socket-api" sample introduction

This sample demonstrates how to use WAMR socket-api to develop wasm network applications. Two wasm applications are provided: tcp-server and tcp-client, and this sample demonstrates how they communicate with each other.

Preparation

Please install WASI SDK, download the wasi-sdk release and extract the archive to default path /opt/wasi-sdk. And install wabt, download the wabt release and extract the archive to default path /opt/wabt

Build the sample

mkdir build
cd build
cmake ..
make

iwasm and three Wasm modules, tcp_server.wasm, tcp_client.wasm, send_recv.wasm will be generated. And their corresponding native version, tcp_server, tcp_client, send_recv are generated too.

Note that iwasm is built with libc-wasi and lib-pthread enabled.

Run workload

Start the tcp server, which opens port 1234 and waits for clients to connect.

cd build
./iwasm --addr-pool=0.0.0.0/15 tcp_server.wasm

Start the tcp client, which connects the server and receives message.

cd build
./iwasm --addr-pool=127.0.0.1/15 tcp_client.wasm

The output of client is like:

[Client] Create socket
[Client] Connect socket
[Client] Client receive
[Client] 115 bytes received:
Buffer recieved:
Say Hi from the Server
Say Hi from the Server
Say Hi from the Server
Say Hi from the Server
Say Hi from the Server

[Client] BYE

send_recv.wasm contains a thread as a server and a thread as a client. They send and receive data via 127.0.0.1:1234.

$ ./iwasm --addr-pool=127.0.0.1/0  ./send_recv.wasm

The output is:

Server is online ...
Client is running...
Start receiving.
Start sending.
Send 106 bytes successfully!
Receive 106 bytes successlly!
Data:
  The stars shine down
  It brings us light
  Light comes down
  To make us paths
  It watches us
  And mourns for us

socket_opts.wasm shows an example of getting and setting various supported socket options

$ ./iwasm ./socket_opts.wasm

The output describes the different socket options that are set & retrieved, like so:

[Client] Create TCP socket
[Client] Create UDP socket
[Client] Create UDP IPv6 socket
SO_RCVTIMEO tv_sec is expected
SO_RCVTIMEO tv_usec is expected
...
[Client] Close sockets

Refer to socket api document for more details.