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