86 lines
2.7 KiB
ReStructuredText
86 lines
2.7 KiB
ReStructuredText
.. _async-sockets-echo-sample:
|
|
|
|
Asynchronous Socket Echo Server
|
|
###############################
|
|
|
|
Overview
|
|
********
|
|
|
|
The sockets/echo-async sample application for Zephyr implements an
|
|
asynchronous IPv4/IPv6 TCP echo server using a BSD Sockets compatible API
|
|
with non-blocking sockets and a ``poll()`` call. This is an extension of
|
|
the :ref:`sockets-echo-sample` sample. It's a more involved application,
|
|
supporting both IPv4 and IPv6 with concurrent connections, limiting
|
|
maximum number of simultaneous connections, and basic error handling.
|
|
|
|
The source code for this sample application can be found at:
|
|
:file:`samples/net/sockets/echo_async`.
|
|
|
|
Requirements
|
|
************
|
|
|
|
- :ref:`networking_with_qemu`
|
|
- or, a board with hardware networking (including 6LoWPAN)
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
Build the Zephyr version of the sockets/echo_async application like this:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_async
|
|
:board: <board_to_use>
|
|
:goals: build
|
|
:compact:
|
|
|
|
``board_to_use`` defaults to ``qemu_x86``. In this case, you can run the
|
|
application in QEMU using ``make run``. If you used another BOARD, you
|
|
will need to consult its documentation for application deployment
|
|
instructions. You can read about Zephyr support for specific boards in
|
|
the documentation at :ref:`boards`.
|
|
|
|
After the sample starts, it expects connections at 192.0.2.1 (IPv4), or
|
|
2001:db8::1 (IPv6), port 4242. The easiest way to connect is:
|
|
|
|
.. code-block:: console
|
|
|
|
$ telnet 192.0.2.1 4242 # use this for IPv4
|
|
$ telnet 2001:db8::1 4242 # or this for IPv6
|
|
|
|
After a connection is made, the application will echo back any line sent to
|
|
it. Unlike the above-mentioned :ref:`sockets-echo-sample`, this application
|
|
supports multiple concurrent client connections. You can open
|
|
another terminal window and run the same telnet command as above.
|
|
The sample supports up to three connected clients, but this can be adjusted
|
|
by changing ``NUM_FDS`` defined in the source code.
|
|
|
|
Running application on POSIX Host
|
|
=================================
|
|
|
|
The same application source code can be built for a POSIX system, e.g.
|
|
Linux. (Note: if you look at the source, you will see that the code is
|
|
the same except the header files are different for Zephyr vs POSIX, and
|
|
there's an additional option to set for Linux to make a socket IPv6-only).
|
|
|
|
To build for a host POSIX OS:
|
|
|
|
.. code-block:: console
|
|
|
|
$ make -f Makefile.posix
|
|
|
|
To run:
|
|
|
|
.. code-block:: console
|
|
|
|
$ ./socket_echo
|
|
|
|
To test:
|
|
|
|
.. code-block:: console
|
|
|
|
$ telnet 127.0.0.1 4242 # use this for IPv4
|
|
$ telnet ::1 4242 # or this for IPv6
|
|
|
|
As can be seen, the behavior of the application is the same as the Zephyr
|
|
version.
|