diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 2abf668..e318f4a 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.1) project(TCPServerClient LANGUAGES C) -add_executable(client client.c extract_ip_port_from_string.c opt_arg.c) +add_executable(client client.c utils/extract_ip_port_from_string.c utils/opt_arg.c ../lib/check_port.c ../lib/set_sockaddr_in.c) target_include_directories(client PUBLIC ./) diff --git a/src/client/client.c b/src/client/client.c index f3832a1..26212cd 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -11,7 +11,8 @@ #include #include #include -#include "opt_arg.h" +#include "utils/opt_arg.h" +#include "../lib/set_sockaddr_in.h" int main(int argc, char** argv) { @@ -21,11 +22,9 @@ int main(int argc, char** argv) { static struct option options[] = {{"factorial", required_argument, 0, 0}, {"server", required_argument, 0, 0}, {0, 0, 0, 0}}; - if (handle_options(argc, argv, options, 2, &factorial, &ip_port)) { return 1; } - if (factorial == -1 || !strlen(ip_port.ip)) { fprintf(stderr, "Using: %s --factorial n --server 127.0.0.1:20001\n", argv[0]); @@ -39,10 +38,8 @@ int main(int argc, char** argv) { } struct sockaddr_in server; - server.sin_family = AF_INET; - server.sin_port = htons(ip_port.port); - server.sin_addr.s_addr = *((unsigned long*)hostname->h_addr); - + set_sockaddr_in(&server, AF_INET, ip_port.port, + *((unsigned long*)hostname->h_addr)); int sck = socket(AF_INET, SOCK_STREAM, 0); if (sck < 0) { fprintf(stderr, "Socket creation failed!\n"); @@ -53,7 +50,6 @@ int main(int argc, char** argv) { fprintf(stderr, "Connection failed\n"); exit(1); } - char task[sizeof(uint64_t)]; memcpy(task, &factorial, sizeof(uint64_t)); @@ -70,7 +66,7 @@ int main(int argc, char** argv) { uint64_t answer = 0; memcpy(&answer, response, sizeof(uint64_t)); - printf("answer: %llu\n", answer); + printf("answer: %lu\n", answer); close(sck); diff --git a/src/client/extract_ip_port_from_string.c b/src/client/utils/extract_ip_port_from_string.c similarity index 87% rename from src/client/extract_ip_port_from_string.c rename to src/client/utils/extract_ip_port_from_string.c index 1c4723b..361e6b4 100644 --- a/src/client/extract_ip_port_from_string.c +++ b/src/client/utils/extract_ip_port_from_string.c @@ -5,8 +5,8 @@ #include #include #include -#include "extract_ip_port_from_string.h" -#include "opt_arg.h" +#include "utils/extract_ip_port_from_string.h" +#include "utils/opt_arg.h" unsigned int convert(char* st) { diff --git a/src/client/extract_ip_port_from_string.h b/src/client/utils/extract_ip_port_from_string.h similarity index 100% rename from src/client/extract_ip_port_from_string.h rename to src/client/utils/extract_ip_port_from_string.h diff --git a/src/client/opt_arg.c b/src/client/utils/opt_arg.c similarity index 87% rename from src/client/opt_arg.c rename to src/client/utils/opt_arg.c index 4201c75..e96cc9e 100644 --- a/src/client/opt_arg.c +++ b/src/client/utils/opt_arg.c @@ -2,20 +2,14 @@ // Created by sergeyampo on 06.06.2020. // #include +#include #include #include #include "opt_arg.h" #include "extract_ip_port_from_string.h" +#include "../../lib/check_port.h" -int check_port(int port) { - if (port < 1024) { - printf("port lower than 1024 may not be free\n"); - return 1; - } - return 0; -} - int handle_options(int argc, char** argv, struct option options[], @@ -43,7 +37,7 @@ int handle_options(int argc, break; case 1: memcpy(server, optarg, strlen(optarg)); extract_ip_port_from_string(server, ':', ip_port); - if (check_port(ip_port->port)) + if (check_port(&ip_port->port)) return 1; break; default:printf("Index %d is out of options\n", option_index); diff --git a/src/client/opt_arg.h b/src/client/utils/opt_arg.h similarity index 100% rename from src/client/opt_arg.h rename to src/client/utils/opt_arg.h diff --git a/src/lib/check_port.c b/src/lib/check_port.c new file mode 100644 index 0000000..0e8780c --- /dev/null +++ b/src/lib/check_port.c @@ -0,0 +1,14 @@ +// +// Created by khrushv on 13.06.2020. +// +#include "check_port.h" +#include + + +int check_port(unsigned int* port) { + if (*port < 1024) { + printf("port lower than 1024 may not be free\n"); + return 1; + } + return 0; +} diff --git a/src/lib/check_port.h b/src/lib/check_port.h new file mode 100644 index 0000000..f21aebd --- /dev/null +++ b/src/lib/check_port.h @@ -0,0 +1,12 @@ +// +// Created by khrushv on 13.06.2020. +// + + + +#ifndef TCPSERVERCLIENT_SRC_LIB_CHECK_PORT_H_ +#define TCPSERVERCLIENT_SRC_LIB_CHECK_PORT_H_ + +int check_port(unsigned int* port); + +#endif //TCPSERVERCLIENT_SRC_LIB_CHECK_PORT_H_ diff --git a/src/lib/set_sockaddr_in.c b/src/lib/set_sockaddr_in.c new file mode 100644 index 0000000..b4a48b6 --- /dev/null +++ b/src/lib/set_sockaddr_in.c @@ -0,0 +1,13 @@ +// +// Created by khrushv on 14.06.2020. +// +#include +#include "set_sockaddr_in.h" + + +void set_sockaddr_in(struct sockaddr_in* server, + short s_port, unsigned short port, unsigned long s_addr) { + server->sin_family = s_port; + server->sin_port = htons(port); + server->sin_addr.s_addr = s_addr; +} \ No newline at end of file diff --git a/src/lib/set_sockaddr_in.h b/src/lib/set_sockaddr_in.h new file mode 100644 index 0000000..a6d4ed5 --- /dev/null +++ b/src/lib/set_sockaddr_in.h @@ -0,0 +1,9 @@ +// +// Created by khrushv on 14.06.2020. +// + +#ifndef TCPSERVERCLIENT_SRC_LIB_SET_SOCKADDR_IN_H_ +#define TCPSERVERCLIENT_SRC_LIB_SET_SOCKADDR_IN_H_ +void set_sockaddr_in(struct sockaddr_in* server, + short s_port, unsigned short port, unsigned long s_addr); +#endif //TCPSERVERCLIENT_SRC_LIB_SET_SOCKADDR_IN_H_ diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 2db2b74..4bc4b33 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,8 +1,9 @@ cmake_minimum_required(VERSION 3.1) project(TCPServerClient LANGUAGES C) -add_executable(server server.c opt_arg.c) +add_executable(server server.c utils/opt_arg.c utils/factorial.c ../lib/check_port.c ../lib/set_sockaddr_in.c) +target_include_directories(server PUBLIC ./) find_package(Threads REQUIRED) target_link_libraries(server ${CMAKE_THREAD_LIBS_INIT}) diff --git a/src/server/server.c b/src/server/server.c index 54ca658..155a67e 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -13,37 +13,17 @@ #include "pthread.h" #include "../lib/thread_pool/thpool.h" -#include "opt_arg.h" +#include "../lib/check_port.h" +#include "utils/opt_arg.h" +#include "utils/factorial.h" +#include "../lib/set_sockaddr_in.h" -int check_tnum(unsigned int* tnum) { - if (*tnum <= 0) { - printf("tnum must be a positive number\n"); - return 1; - } - return 0; -} - -int check_port(unsigned int* port) { - if (*port < 1024) { - printf("port lower than 1024 may not be free\n"); - return 1; - } - return 0; -} - -uint64_t factorial(const uint64_t* n) { - uint64_t factorial = 1; - uint64_t r = *n; - for (uint64_t i = 2; i <= r; ++i) - factorial *= i; - return factorial; -} void* socket_thread(void* arg) { + printf("Into thread %d\n", (int)pthread_self()); int newSocket = *((int*)arg); while (true) { - //TODO: make variable for count of parameters unsigned int buffer_size = sizeof(uint64_t); char from_client[buffer_size]; int read = recv(newSocket, from_client, buffer_size, 0); @@ -59,9 +39,9 @@ void* socket_thread(void* arg) { } uint64_t factorial_number = 0; memcpy(&factorial_number, from_client, sizeof(uint64_t)); - fprintf(stdout, "Receive: %llu \n", factorial_number); + fprintf(stdout, "Receive: %lu \n", factorial_number); uint64_t total = factorial(&factorial_number); - printf("Total: %llu\n", total); + printf("Total: %lu\n", total); char buffer[sizeof(total)]; memcpy(buffer, &total, sizeof(total)); @@ -78,7 +58,6 @@ void* socket_thread(void* arg) { int main(int argc, char** argv) { size_t options_amount = 2; - //TODO: remove "tnum" parameter static struct option options[] = {{"port", required_argument, 0, 0}, {"tnum", required_argument, 0, 0}, {0, 0, 0, 0}}; @@ -87,13 +66,10 @@ int main(int argc, char** argv) { int (* callbacks[options_amount])(unsigned int*); //Array of callbacks callbacks[0] = check_port; callbacks[1] = check_tnum; - unsigned int* handled_options = handle_options(argc, argv, options, options_amount, callbacks); - - threadpool thpool = thpool_init(4); - unsigned port = handled_options[0]; unsigned tnum = handled_options[1]; + threadpool thpool = thpool_init(tnum); if (port == -1 || tnum == -1) { fprintf(stderr, "Using: %s --port 20001 --tnum 4\n", argv[0]); @@ -107,10 +83,7 @@ int main(int argc, char** argv) { } struct sockaddr_in server; - server.sin_family = AF_INET; - server.sin_port = htons(port); - server.sin_addr.s_addr = htonl(INADDR_ANY); - + set_sockaddr_in(&server, AF_INET, port, INADDR_ANY); int opt_val = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof(opt_val)); @@ -137,7 +110,7 @@ int main(int argc, char** argv) { fprintf(stderr, "Could not establish new connection\n"); continue; } - + printf("Num of active threads worker %d\n", thpool_num_threads_working(thpool)); thpool_add_work(thpool, (void*)socket_thread, &client_fd); } thpool_destroy(thpool); diff --git a/src/server/utils/factorial.c b/src/server/utils/factorial.c new file mode 100644 index 0000000..feee35d --- /dev/null +++ b/src/server/utils/factorial.c @@ -0,0 +1,14 @@ +// +// Created by khrushv on 13.06.2020. +// + +#include "factorial.h" + + +uint64_t factorial(const uint64_t* n) { + uint64_t factorial = 1; + uint64_t r = *n; + for (uint64_t i = 2; i <= r; ++i) + factorial *= i; + return factorial; +} \ No newline at end of file diff --git a/src/server/utils/factorial.h b/src/server/utils/factorial.h new file mode 100644 index 0000000..a065575 --- /dev/null +++ b/src/server/utils/factorial.h @@ -0,0 +1,12 @@ +// +// Created by khrushv on 13.06.2020. +// + +#include + +#ifndef TCPSERVERCLIENT_SRC_SERVER_FACTORIAL_H_ +#define TCPSERVERCLIENT_SRC_SERVER_FACTORIAL_H_ + +uint64_t factorial(const uint64_t* n); + +#endif //TCPSERVERCLIENT_SRC_SERVER_FACTORIAL_H_ diff --git a/src/server/opt_arg.c b/src/server/utils/opt_arg.c similarity index 89% rename from src/server/opt_arg.c rename to src/server/utils/opt_arg.c index 8ba675b..fc67ce7 100644 --- a/src/server/opt_arg.c +++ b/src/server/utils/opt_arg.c @@ -7,6 +7,14 @@ #include "opt_arg.h" +int check_tnum(unsigned int* tnum) { + if (*tnum <= 0) { + printf("tnum must be a positive number\n"); + return 1; + } + return 0; +} + unsigned int* handle_options(int argc, char** argv, struct option options[], diff --git a/src/server/opt_arg.h b/src/server/utils/opt_arg.h similarity index 89% rename from src/server/opt_arg.h rename to src/server/utils/opt_arg.h index f7ac200..43b8372 100644 --- a/src/server/opt_arg.h +++ b/src/server/utils/opt_arg.h @@ -10,4 +10,6 @@ unsigned int* handle_options(int, char**, struct option[], const int, int (* [])(unsigned int*)); +int check_tnum(unsigned int* tnum); + #endif //TCPSERVERCLIENT_SRC_SERVER_OPT_ARG_H_ \ No newline at end of file