文本文件  |  61行  |  2.08 KB

Nanopb example "network_server"
===============================

This example demonstrates the use of nanopb to communicate over network
connections. It consists of a server that sends file listings, and of
a client that requests the file list from the server.

Example usage
-------------

user@host:~/nanopb/examples/network_server$ make        # Build the example
protoc -ofileproto.pb fileproto.proto
python ../../generator/nanopb_generator.py fileproto.pb
Writing to fileproto.pb.h and fileproto.pb.c
cc -ansi -Wall -Werror -I .. -g -O0 -I../.. -o server server.c
    ../../pb_decode.c ../../pb_encode.c fileproto.pb.c common.c
cc -ansi -Wall -Werror -I .. -g -O0 -I../.. -o client client.c
    ../../pb_decode.c ../../pb_encode.c fileproto.pb.c common.c

user@host:~/nanopb/examples/network_server$ ./server &  # Start the server on background
[1] 24462

petteri@oddish:~/nanopb/examples/network_server$ ./client /bin  # Request the server to list /bin
Got connection.
Listing directory: /bin
1327119    bzdiff
1327126    bzless
1327147    ps
1327178    ntfsmove
1327271    mv
1327187    mount
1327259    false
1327266    tempfile
1327285    zfgrep
1327165    gzexe
1327204    nc.openbsd
1327260    uname


Details of implementation
-------------------------
fileproto.proto contains the portable Google Protocol Buffers protocol definition.
It could be used as-is to implement a server or a client in any other language, for
example Python or Java.

fileproto.options contains the nanopb-specific options for the protocol file. This
sets the amount of space allocated for file names when decoding messages.

common.c/h contains functions that allow nanopb to read and write directly from
network socket. This way there is no need to allocate a separate buffer to store
the message.

server.c contains the code to open a listening socket, to respond to clients and
to list directory contents.

client.c contains the code to connect to a server, to send a request and to print
the response message.

The code is implemented using the POSIX socket api, but it should be easy enough
to port into any other socket api, such as lwip.