diff options
Diffstat (limited to 'examples/network_server/client.c')
-rw-r--r-- | examples/network_server/client.c | 96 |
1 files changed, 37 insertions, 59 deletions
diff --git a/examples/network_server/client.c b/examples/network_server/client.c index ca0c68e..e6e9a2e 100644 --- a/examples/network_server/client.c +++ b/examples/network_server/client.c @@ -23,13 +23,9 @@ #include "fileproto.pb.h" #include "common.h" -/* This callback function will be called once for each filename received - * from the server. The filenames will be printed out immediately, so that - * no memory has to be allocated for them. - */ bool printfile_callback(pb_istream_t *stream, const pb_field_t *field, void **arg) { - FileInfo fileinfo = {}; + FileInfo fileinfo; if (!pb_decode(stream, FileInfo_fields, &fileinfo)) return false; @@ -39,66 +35,51 @@ bool printfile_callback(pb_istream_t *stream, const pb_field_t *field, void **ar return true; } -/* This function sends a request to socket 'fd' to list the files in - * directory given in 'path'. The results received from server will - * be printed to stdout. - */ bool listdir(int fd, char *path) { - /* Construct and send the request to server */ + ListFilesRequest request; + ListFilesResponse response; + pb_istream_t input = pb_istream_from_socket(fd); + pb_ostream_t output = pb_ostream_from_socket(fd); + uint8_t zero = 0; + + if (path == NULL) { - ListFilesRequest request = {}; - pb_ostream_t output = pb_ostream_from_socket(fd); - - /* In our protocol, path is optional. If it is not given, - * the server will list the root directory. */ - if (path == NULL) - { - request.has_path = false; - } - else - { - request.has_path = true; - if (strlen(path) + 1 > sizeof(request.path)) - { - fprintf(stderr, "Too long path.\n"); - return false; - } - - strcpy(request.path, path); - } - - /* Encode the request. It is written to the socket immediately - * through our custom stream. */ - if (!pb_encode_delimited(&output, ListFilesRequest_fields, &request)) - { - fprintf(stderr, "Encoding failed: %s\n", PB_GET_ERROR(&output)); - return false; - } + request.has_path = false; } - - /* Read back the response from server */ + else { - ListFilesResponse response = {}; - pb_istream_t input = pb_istream_from_socket(fd); - - /* Give a pointer to our callback function, which will handle the - * filenames as they arrive. */ - response.file.funcs.decode = &printfile_callback; - - if (!pb_decode_delimited(&input, ListFilesResponse_fields, &response)) + request.has_path = true; + if (strlen(path) + 1 > sizeof(request.path)) { - fprintf(stderr, "Decode failed: %s\n", PB_GET_ERROR(&input)); + fprintf(stderr, "Too long path.\n"); return false; } - /* If the message from server decodes properly, but directory was - * not found on server side, we get path_error == true. */ - if (response.path_error) - { - fprintf(stderr, "Server reported error.\n"); - return false; - } + strcpy(request.path, path); + } + + if (!pb_encode(&output, ListFilesRequest_fields, &request)) + { + fprintf(stderr, "Encoding failed.\n"); + return false; + } + + /* We signal the end of request with a 0 tag. */ + pb_write(&output, &zero, 1); + + response.file.funcs.decode = &printfile_callback; + + if (!pb_decode(&input, ListFilesResponse_fields, &response)) + { + fprintf(stderr, "Decode failed: %s\n", PB_GET_ERROR(&input)); + return false; + } + + if (response.path_error) + { + fprintf(stderr, "Server reported error.\n"); + return false; } return true; @@ -115,7 +96,6 @@ int main(int argc, char **argv) sockfd = socket(AF_INET, SOCK_STREAM, 0); - /* Connect to server running on localhost:1234 */ memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); @@ -127,11 +107,9 @@ int main(int argc, char **argv) return 1; } - /* Send the directory listing request */ if (!listdir(sockfd, path)) return 2; - /* Close connection */ close(sockfd); return 0; |