Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.88 KB | None | 0 0
  1. /* server.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <time.h>
  10. #include <arpa/inet.h>
  11. #include <limits.h>
  12.  
  13. #include "../debug/debug.h"
  14. #include "../cmdline/server_cmdline.h"
  15. #include "common.h"
  16.  
  17. int setup_TCP_server(int porto, int backlog);
  18. void handle_requests(int tcp_server_socket);
  19. void process_cmd(uint8_t option, char *buffer, int buffer_len);
  20.  
  21. int main(int argc, char *argv[]) {
  22. struct gengetopt_args_info args;
  23.  
  24. if( cmdline_parser(argc, argv, &args) )
  25. ERROR(99, "Erro: execução de cmdline_parser\n");
  26.  
  27. /* criar socket - servidor */
  28. int max_connections = 1;
  29. int tcp_server_socket = setup_TCP_server(args.porto_arg, max_connections);
  30.  
  31. handle_requests(tcp_server_socket);
  32.  
  33. /* close - socket servidor */
  34. close(tcp_server_socket);
  35.  
  36. cmdline_parser_free(&args);
  37.  
  38. exit(0);
  39. }
  40.  
  41. void handle_requests(int tcp_server_socket){
  42. char tcp_client_string_ip[20];
  43. struct sockaddr_in tcp_client_endpoint;
  44. int tcp_client_socket;
  45. ssize_t recv_bytes, send_bytes;
  46. uint8_t option;
  47. char buffer[MAX_STR];
  48.  
  49. while(1){
  50. memset(&tcp_client_endpoint, 0, sizeof(struct sockaddr_in));
  51. socklen_t tcp_client_endpoint_length = sizeof(struct sockaddr_in);
  52.  
  53. /* accept */
  54. printf("à espera da ligação do cliente... "); fflush(stdout);
  55. if ((tcp_client_socket = accept(tcp_server_socket, (struct sockaddr *) &tcp_client_endpoint, &tcp_client_endpoint_length)) == -1)
  56. ERROR(54, "Can't accept client");
  57. printf("ok. \n");
  58. printf("cliente: %s@%d\n", inet_ntop(AF_INET, &tcp_client_endpoint.sin_addr, tcp_client_string_ip, sizeof(tcp_client_string_ip)), htons(tcp_client_endpoint.sin_port));
  59.  
  60. /* comunicacao com o cliente */
  61. if((recv_bytes = recv(tcp_client_socket, &option, sizeof(option), 0)) == -1){
  62. close(tcp_client_socket);
  63. ERROR(43, "Erro no recv()\n");
  64. }
  65. printf("ok. (%d bytes recebidos)\n", recv_bytes);
  66.  
  67. sleep(3);
  68.  
  69. //processar a data
  70. process_cmd(option, buffer, MAX_STR);
  71.  
  72. /* devolver resposta para cliente - send */
  73. if((send_bytes = send(tcp_client_socket, buffer, strlen(buffer), 0)) == -1 ){
  74. close(tcp_client_socket);
  75. ERROR(43, "Erro no send()\n");
  76. }
  77. printf("ok. (%d bytes enviados)\n", send_bytes);
  78.  
  79. /* close - socket cliente */
  80. close(tcp_client_socket);
  81. }
  82. }
  83.  
  84. void process_cmd(uint8_t option, char *buffer, int buffer_len){
  85. time_t t = time(NULL);
  86. struct tm *localtime_ptr;
  87. localtime_ptr = localtime(&t);
  88.  
  89. if(localtime_ptr == NULL){
  90. WARNING("Error on localtime()\n");
  91. return;
  92. }
  93.  
  94. switch(option){
  95. case 0: //data+hora
  96. strftime(buffer, buffer_len, "%Y%m%d_%Hh%M:%S", localtime_ptr);
  97. break;
  98. case 1: //data
  99. strftime(buffer, buffer_len, "%Y%m%d", localtime_ptr);
  100. break;
  101. case 2: //hora
  102. strftime(buffer, buffer_len, "%Hh%M:%S", localtime_ptr);
  103. break;
  104. default: //devolve msg de erro
  105. snprintf(buffer, buffer_len, "Unknown cmd '%d'", option);
  106. }
  107. }
  108.  
  109. int setup_TCP_server(int porto, int backlog){
  110. int tcp_server_socket;
  111.  
  112. if(porto < 1 || porto > USHRT_MAX){
  113. ERROR(99, "Porto não está numa gama válida");
  114. }
  115.  
  116. if ((tcp_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  117. ERROR(51, "Can't create tcp_server_socket (IPv4)");
  118.  
  119. /* registar socket - servidor */
  120. struct sockaddr_in tcp_server_endpoint;
  121. memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));
  122. tcp_server_endpoint.sin_family = AF_INET;
  123. tcp_server_endpoint.sin_addr.s_addr = htonl(INADDR_ANY); // Todas as interfaces de rede
  124. tcp_server_endpoint.sin_port = htons(porto); // Server port
  125.  
  126. if (bind(tcp_server_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
  127. ERROR(52, "Can't bind @tcp_server_endpoint");
  128.  
  129. /* listen */
  130. if (listen(tcp_server_socket, backlog) == -1)
  131. ERROR(53, "Can't listen for %d clients", backlog);
  132.  
  133. return tcp_server_socket;
  134. }
  135.  
  136. /* client.c */
  137. #include <stdio.h>
  138. #include <stdlib.h>
  139. #include <errno.h>
  140. #include <sys/socket.h>
  141. #include <unistd.h>
  142. #include <sys/types.h>
  143. #include <arpa/inet.h>
  144. #include <string.h>
  145. #include <sys/wait.h>
  146. #include <limits.h>
  147.  
  148. #include "../debug/debug.h"
  149. #include "../cmdline/client_cmdline.h"
  150. #include "common.h"
  151.  
  152. #define FILHOS 5
  153.  
  154. void executa_pedido(struct gengetopt_args_info args);
  155.  
  156. int main(int argc, char *argv[])
  157. {
  158. struct gengetopt_args_info args;
  159.  
  160. // cmdline_parser: deve ser a primeira linha de código no main
  161. if( cmdline_parser(argc, argv, &args) )
  162. ERROR(99, "Erro: execução de cmdline_parser\n");
  163.  
  164. pid_t pid;
  165. int i;
  166.  
  167. for(i=0; i<FILHOS; i++){
  168. pid = fork();
  169. if(pid == 0){//proc. filho
  170. printf("Processo filho '%d'\n", i+1);
  171. executa_pedido(args);
  172. exit(0);
  173. }else if(pid > 0){//proc. pai
  174.  
  175. }else{
  176. ERROR(99, "Erro no fork()\n");
  177. }
  178. }
  179.  
  180. for(i=0; i<FILHOS; i++){
  181. wait(NULL);
  182. }
  183.  
  184. // libertar recurso (cmdline_parser)
  185. cmdline_parser_free(&args);
  186.  
  187. exit(0);
  188. }
  189.  
  190. void executa_pedido(struct gengetopt_args_info args){
  191. /* socket */
  192. if(args.porto_arg < 1 || args.porto_arg > USHRT_MAX){
  193. ERROR(99, "Porto não está numa gama válida");
  194. }
  195.  
  196. int tcp_client_socket;
  197. if ((tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  198. ERROR(41, "Can't create tcp_client_socket (IPv4)");
  199.  
  200. /* connect */
  201. struct sockaddr_in tcp_server_endpoint;
  202. memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));
  203. tcp_server_endpoint.sin_family = AF_INET;
  204.  
  205. /* converter ip de formato string para binário (rede) */
  206. switch (inet_pton(AF_INET, args.ip_arg, &tcp_server_endpoint.sin_addr)) {
  207. case 0:
  208. fprintf(stderr, "[%s@%d] ERROR - Cannot convert IP address (IPv4): Invalid Network Address\n", __FILE__, __LINE__);
  209. exit(22);
  210. case -1:
  211. ERROR(22, "Cannot convert IP address (IPv4)");
  212. }
  213. tcp_server_endpoint.sin_port = htons(args.porto_arg);
  214.  
  215. printf("a ligar ao servidor... "); fflush(stdout);
  216. if (connect(tcp_client_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
  217. ERROR(43, "Can't connect @tcp_server_endpoint");
  218. printf("ok. \n");
  219.  
  220. /* enviar string ao servidor */
  221. ssize_t send_bytes, recv_bytes;
  222. uint8_t option = 0;
  223. char response[MAX_STR];
  224.  
  225. if((send_bytes = send(tcp_client_socket, &option, sizeof(option), 0)) == -1 ){
  226. close(tcp_client_socket);
  227. ERROR(43, "Erro no send()\n");
  228. }
  229. printf("ok. (%d bytes enviados)\n", send_bytes);
  230.  
  231. /* aguardar resposta do servidor */
  232. if((recv_bytes = recv(tcp_client_socket, response, MAX_STR, 0)) == -1){
  233. close(tcp_client_socket);
  234. ERROR(43, "Erro no recv()\n");
  235. }
  236. printf("ok. (%d bytes recebidos)\n", recv_bytes);
  237.  
  238. response[recv_bytes] = '\0';
  239.  
  240. /* mostrar resposta do servidor */
  241. printf("Valor recebido do servidor: %s\n", response);
  242.  
  243. /* close */
  244. if (close(tcp_client_socket) == -1)
  245. ERROR(45, "Can't close tcp_client_socket (IPv4)");
  246. printf("ligação fechada. ok. \n");
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement