"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 ..
makeiwasm and the following Wasm modules (along with their corresponding native version) will be generated:
addr_resolve.wasm,addr_resolvesend_recv.wasm,send_recvsocket_opts.wasm,socket_optstcp_client.wasm,tcp_clienttcp_server.wasm,tcp_serverudp_client.wasm,udp_clientudp_server.wasm,udp_server
Note that iwasm is built with libc-wasi and lib-pthread enabled.
Run workload
TCP client/server
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.wasmStart the tcp client, which connects the server and receives message.
cd build
./iwasm --addr-pool=127.0.0.1/15 tcp_client.wasmThe 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 options
socket_opts.wasm shows an example of getting and setting various supported socket options
$ ./iwasm socket_opts.wasm
The output is:
[Client] Create TCP socket [Client] Create UDP socket [Client] Create UDP IPv6 socket setsockopt SO_RCVTIMEO result is expected getsockopt SO_RCVTIMEO result is expected ... [Client] Close sockets
The timeout_client.wasm and timeout_server.wasm examples demonstrate socket send and receive timeouts using the socket options. Start the server, then start the client.
$ ./iwasm --addr-pool=0.0.0.0/15 timeout_server.wasm
The output is:
Wait for client to connect Client connected, sleeping for 10s Shuting down
$ ./iwasm --addr-pool=127.0.0.1/15 timeout_client.wasm
The output is:
Waiting on recv, which should timeout Waiting on send, which should timeout Success. Closing socket
The multicast_client and multicast_server examples demonstrate receiving multicast packets in WASM. Start the client and then the server with a multicast IP address and port.
$ ./iwasm --addr-pool=0.0.0.0/0,::/0 multicast_client.wasm <Multicast IP> <Port> $ ./iwasm --addr-pool=0.0.0.0/0,::/0 multicast_client.wasm 224.0.0.1 $ ./iwasm --addr-pool=0.0.0.0/0,::/0 multicast_client.wasm FF02:113D:6FDD:2C17:A643:FFE2:1BD1:3CD2
The output should be
Joined multicast group. Waiting for datagram... Reading datagram message...OK. The message from multicast server is: "Test message"
$ ./multicast_server <Multicast IP> <Port> $ ./multicast_server 224.0.0.1 $ ./multicast_server FF02:113D:6FDD:2C17:A643:FFE2:1BD1:3CD2
The output should be
Domain name server resolution
addr_resolve.wasm demonstrates the usage of resolving a domain name
$ ./iwasm --allow-resolve=*.com addr_resolve.wasm github.com
The command displays the host name and its corresponding IP address:
Host: github.com
IPv4 address: 140.82.121.4 (TCP)
UDP client/server
Start the UDP server, which opens port 1234 and waits for clients to send a message.
cd build
./iwasm --addr-pool=0.0.0.0/15 udp_server.wasmStart the tcp client, which sends a message to the server and waits for the response.
cd build
./iwasm --addr-pool=127.0.0.1/15 udp_client.wasmThe output of client is like:
[Client] Create socket [Client] Client send [Client] Client receive [Client] Buffer recieved: Hello from server [Client] BYE
The output of the server is like:
[Server] Create socket
[Server] Bind socket
[Server] Wait for clients to connect ..
[Server] received 17 bytes from 127.0.0.1:60927: Hello from client
Documentation
Refer to socket api document for more details.