From 2a42ad20b9730706ad371ae3787d4597c4e42276 Mon Sep 17 00:00:00 2001 From: sharath reddy Date: Tue, 4 Jun 2019 11:53:49 +0530 Subject: Feature: 19.04 part-2 Change-Id: I0b52a6bb67c25c7955d58e29eb81a3cc9efea9e9 Signed-off-by: sharath reddy --- app_example/func-test/fork/tcpserver.c | 156 +++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 app_example/func-test/fork/tcpserver.c (limited to 'app_example/func-test/fork/tcpserver.c') diff --git a/app_example/func-test/fork/tcpserver.c b/app_example/func-test/fork/tcpserver.c new file mode 100644 index 0000000..73c053a --- /dev/null +++ b/app_example/func-test/fork/tcpserver.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct sockaddr_in g_src; +int srcPort = 0; +int destPort = 0; +int times = 0; + +#ifdef DEBUG +#define DBG(fmt, arg...) do { \ + DBG(fmt, ##arg); \ +} while(0) +#else +#define DBG(fmt, arg...) ((void)0) +#endif + +static void setArgsDefault() +{ + memset(&g_src, 0, sizeof(g_src)); + g_src.sin_family = AF_INET; + g_src.sin_addr.s_addr = inet_addr("0.0.0.0"); + g_src.sin_port = htons(7895); + bzero(&(g_src.sin_zero), 8); + + times = 1; +} + +static int process_arg(int argc, char *argv[]) +{ + int opt = 0; + int error = 0; + const char *optstring = "s:a:t:"; + + if (argc < 5) + { + DBG("Param info :-p dest_portid; -d dest_serverIP; -a src_portid; -s src_clientIP; -t times; \n"); + return -1; + } + setArgsDefault(); + while ((opt = getopt(argc, argv, optstring)) != -1) + { + switch (opt) + { + case 's': + g_src.sin_addr.s_addr = inet_addr(optarg); + break; + case 'a': + g_src.sin_port = htons(atoi(optarg)); + break; + case 't': + times = atoi(optarg); + break; + } + } + return 0; +} + +int main(int argc, char *argv[]) +{ + + int sockfd, ret; + int newSocket; + socklen_t addr_size; + static struct sockaddr_in accept_addr; + char buffer[1024]; + pid_t childpid; + + /* + * check command line arguments + */ + if (0 != process_arg(argc, argv)) + { + DBG("Error in argument.%d\n", argc); + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + { + DBG("Error in connection.\n"); + exit(1); + } + DBG("Server Socket is created. %d\n", sockfd); + + ret = bind(sockfd, (struct sockaddr *) &g_src, sizeof(g_src)); + if (ret < 0) + { + DBG("Error in binding.\n"); + exit(1); + } + + DBG("Bind sucess port %d\n", g_src.sin_port); + + if (listen(sockfd, 10) == 0) + { + DBG("Listening on %s....\n", inet_ntoa(g_src.sin_addr)); + } + else + { + DBG("Error in binding.\n"); + } + + while (1) + { + newSocket = + accept(sockfd, (struct sockaddr *) &accept_addr, &addr_size); + if (newSocket < 0) + { + DBG("Error: Exiting here pid %d", getpid()); + exit(1); + } + + DBG("Connection accepted from %s:%d fd %d\n", + inet_ntoa(accept_addr.sin_addr), + ntohs(accept_addr.sin_port), newSocket); + if ((childpid = fork()) == 0) + { + DBG("[ PID %d] Child process Created. Pid %d \r\n", getpid(), + getpid()); + DBG("[ PID %d] Closing fd %d\n", getpid(), sockfd); + close(sockfd); + + while (1) + { + memset(buffer, '\0', 1024 * sizeof(char)); + recv(newSocket, buffer, 1024, 0); + if (strcmp(buffer, "#exit") == 0) + { + DBG("Disconnected from %s:%d\n", + inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port)); + break; + } + else + { + DBG("[PID %d]Client: %s\n", getpid(), buffer); + send(newSocket, buffer, strlen(buffer), 0); + bzero(buffer, sizeof(buffer)); + } + } + + DBG("[PID %d]Closing socket %d\r\n", getpid(), newSocket); + close(newSocket); + } + + } + + DBG("[PID %d]Process exiting... %d\r\n", getpid(), getpid()); + return 0; +} -- cgit 1.2.3-korg