From 3c6f5161b2903c1bf59bcc959301a7390c3c5c79 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 21 Mar 2016 17:41:29 +0100 Subject: tools: Simple echo application This adds a simple echo application written to show application how to use the API. It also updates the dev.h header file with the insights gained from performing this excercise. --- src/tools/echo/CMakeLists.txt | 16 +++++++ src/tools/echo/echo.c | 57 +++++++++++++++++++++++ src/tools/echo/echo_client.c | 69 ++++++++++++++++++++++++++++ src/tools/echo/echo_server.c | 103 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+) create mode 100644 src/tools/echo/CMakeLists.txt create mode 100644 src/tools/echo/echo.c create mode 100644 src/tools/echo/echo_client.c create mode 100644 src/tools/echo/echo_server.c (limited to 'src/tools/echo') diff --git a/src/tools/echo/CMakeLists.txt b/src/tools/echo/CMakeLists.txt new file mode 100644 index 00000000..b3d88089 --- /dev/null +++ b/src/tools/echo/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + echo.c +) + +add_executable(echo-app ${SOURCE_FILES}) + +target_link_libraries(echo-app LINK_PUBLIC ouroboros) + +install(TARGETS echo-app RUNTIME DESTINATION bin) diff --git a/src/tools/echo/echo.c b/src/tools/echo/echo.c new file mode 100644 index 00000000..849c0ca8 --- /dev/null +++ b/src/tools/echo/echo.c @@ -0,0 +1,57 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include + +#define SERVER_AP_NAME "echo-server" +#define BUF_SIZE 256 + +#include "echo_client.c" +#include "echo_server.c" + +static void usage() +{ + printf("Usage: echo-app [OPTION]...\n" + "Sends an echo between a server and a client\n\n" + " -l, --listen Run in server mode\n" + " --help Display this help text and exit\n"); +} + +int main(int argc, char ** argv) { + + argc--; + argv++; + while (argc > 0) { + if (strcmp(*argv, "-l") == 0 || + strcmp(*argv, "--listen") == 0) { + return server_main(); + } else { + usage(); + return 0; + } + argc--; + argv++; + } + + return client_main(); +} diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c new file mode 100644 index 00000000..2f80a52a --- /dev/null +++ b/src/tools/echo/echo_client.c @@ -0,0 +1,69 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define CLIENT_AP_NAME "echo-client" + +#include +#include + +int client_main() +{ + int fd = 0; + int result = 0; + uint8_t buf[BUF_SIZE]; + char * message = "Client says hi!"; + ssize_t count = 0; + + fd = flow_alloc(SERVER_AP_NAME, NULL, + CLIENT_AP_NAME, NULL, + NULL, 0); + if (fd < 0) { + printf("Failed to allocate flow\n"); + return -1; + } + + result = flow_alloc_res(fd); + if (result < 0) { + printf("Flow allocation refused\n"); + flow_dealloc(fd); + return -1; + } + + if (flow_write(fd, message, strlen(message) + 1) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(fd); + return -1; + } + + count = flow_read(fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(fd); + return -1; + } + + printf("Server replied with %.*s\n", (int) count, buf); + + flow_dealloc(fd); + + return 0; +} diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c new file mode 100644 index 00000000..f9682ab7 --- /dev/null +++ b/src/tools/echo/echo_server.c @@ -0,0 +1,103 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include +#include + +#define DIF_NAME "*" + +void shutdown_server(int signo) +{ + char * dif = DIF_NAME; + + if (ap_unreg(SERVER_AP_NAME, NULL, &dif, 1)) { + printf("Failed to unregister application\n"); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} + +int server_main() +{ + int server_fd = 0; + int client_fd = 0; + char * dif = DIF_NAME; + char * client_name = NULL; + uint8_t buf[BUF_SIZE]; + ssize_t count = 0; + + printf("Starting the server\n"); + + /* Manual cleanup is required for now */ + if (signal(SIGINT, shutdown_server) == SIG_ERR) { + printf("Can't install signal handler\n"); + return -1; + } + + server_fd = ap_reg(SERVER_AP_NAME, NULL, &dif, 1); + if (server_fd < 0) { + printf("Failed to register application\n"); + return -1; + } + + while (true) { + client_fd = flow_accept(server_fd, + client_name, NULL); + if (client_fd < 0) { + printf("Failed to accept flow\n"); + continue; + } + + printf("New flow from %s", client_name); + + if (flow_alloc_resp(client_fd, 0)) { + printf("Failed to give an allocate response\n"); + flow_dealloc(client_fd); + continue; + } + + count = flow_read(client_fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(client_fd); + continue; + } + + printf("Message from client is %.*s\n", (int) count, buf); + + if (flow_write(client_fd, buf, count) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(client_fd); + continue; + } + + flow_dealloc(client_fd); + } + + return 0; +} -- cgit v1.2.3