Advertisement
Guest User

PAF7Lab3Server

a guest
Nov 21st, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8.  
  9. #include "../debug/debug.h"
  10. #include "../cmdline/server_cmdline.h"
  11.  
  12. #define PORT_LIMIT  1 << 16
  13.  
  14. int setup_tcp_server(uint16_t port);
  15.  
  16. int main(int argc, char *argv[])
  17. {
  18.     struct gengetopt_args_info args;
  19.  
  20.     // cmdline_parser: deve ser a primeira linha de código no main
  21.     if( cmdline_parser(argc, argv, &args) )
  22.         ERROR(99, "Erro: execução de cmdline_parser\n");
  23.  
  24.     int port = args.porto_arg;
  25.     if (port <= 0 || port >= PORT_LIMIT) {
  26.         fprintf(stderr, "Invalid port (%d)\n", port);
  27.         return 44;
  28.     }
  29.  
  30.     int tcp_server_socket = setup_tcp_server(port);
  31.  
  32.     // TCP IPv4: "accept" 1 cliente (bloqueante)
  33.     char tcp_client_string_ip[20];
  34.     struct sockaddr_in tcp_client_endpoint;
  35.     socklen_t tcp_client_endpoint_length = sizeof(struct sockaddr_in);
  36.     int tcp_client_socket;
  37.  
  38.     while(1){
  39.         printf("à espera da ligação do cliente... "); fflush(stdout);
  40.         if ((tcp_client_socket = accept(
  41.             tcp_server_socket,
  42.             (struct sockaddr *) &tcp_client_endpoint,
  43.             &tcp_client_endpoint_length)) == -1){
  44.             ERROR(54, "Can't accept client");
  45.         }
  46.            
  47.         printf("ok. \n");          
  48.         printf("cliente: %s@%d\n",
  49.             inet_ntop(
  50.                 AF_INET,
  51.                 &tcp_client_endpoint.sin_addr,
  52.                 tcp_client_string_ip,
  53.                 sizeof(tcp_client_string_ip)),
  54.             htons(tcp_client_endpoint.sin_port));
  55.  
  56.  
  57.         // TCP IPv4: variáveis auxiliares para send() / recv()
  58.         ssize_t tcp_read_bytes, tcp_sent_bytes;
  59.         char buffer[100];
  60.  
  61.         // TCP IPv4: "recv" do cliente (bloqueante)
  62.         printf("à espera de dados do cliente... "); fflush(stdout);
  63.         if ((tcp_read_bytes = recv(
  64.             tcp_client_socket,
  65.             buffer,
  66.             sizeof(buffer) - 1,
  67.             0)) == -1)
  68.             ERROR(57, "Can't recv from client");
  69.         printf("ok.  (%d bytes sent)\n", (int)tcp_read_bytes);
  70.  
  71.         buffer[tcp_read_bytes] = '\0';
  72.  
  73.         if (tcp_read_bytes == 0) {
  74.             fprintf(stderr, "Client closed connection!\n");
  75.             if (close(tcp_client_socket) == -1){
  76.                 ERROR(55, "Can't close tcp_client_socket (IPv4)");
  77.             }
  78.             continue;
  79.         }
  80.  
  81.         printf("Number String: %s\n", buffer);
  82.  
  83.         uint32_t number = atoi(buffer);
  84.         number = htonl(number);
  85.         // TCP IPv4: "send" para o cliente
  86.         printf("a enviar dados para o cliente... "); fflush(stdout);
  87.         if ((tcp_sent_bytes = send(
  88.             tcp_client_socket,
  89.             &number,
  90.             sizeof(number),
  91.             0)) == -1)
  92.             ERROR(58, "Can't send to client");
  93.         printf("ok.  (%d bytes received)\n", (int)tcp_sent_bytes); 
  94.  
  95.         // TCP IPv4: fecha socket (client)
  96.         if (close(tcp_client_socket) == -1){
  97.             ERROR(55, "Can't close tcp_client_socket (IPv4)");
  98.         }
  99.     }
  100.            
  101.     // TCP IPv4: fecha socket (server)
  102.     if (close(tcp_server_socket) == -1)
  103.         ERROR(56, "Can't close tcp_server_socket (IPv4)"); 
  104.     printf("ligação fechada. ok. \n");
  105.  
  106.     // libertar recurso (cmdline_parser)
  107.     cmdline_parser_free(&args);
  108.  
  109.     exit(0);
  110. }
  111.  
  112. int setup_tcp_server(uint16_t port){
  113.     // TCP IPv4: cria socket
  114.     int tcp_server_socket;
  115.     if ((tcp_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  116.         ERROR(51, "Can't create tcp_server_socket (IPv4)");
  117.  
  118.     // TCP IPv4: bind a IPv4/porto  
  119.     struct sockaddr_in tcp_server_endpoint;
  120.     memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));   
  121.     tcp_server_endpoint.sin_family = AF_INET;
  122.     tcp_server_endpoint.sin_addr.s_addr = htonl(INADDR_ANY);        // Todas as interfaces de rede
  123.     tcp_server_endpoint.sin_port = htons(port);     // Server port
  124.     if (bind(tcp_server_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
  125.         ERROR(52, "Can't bind @tcp_server_endpoint");
  126.  
  127.     // TCP IPv4: "listen" por clientes
  128.     int tcp_max_simultaneous_clients = 1;          
  129.     if (listen(tcp_server_socket, tcp_max_simultaneous_clients)  == -1)
  130.         ERROR(53, "Can't listen for %d clients", tcp_max_simultaneous_clients);
  131.  
  132.     return tcp_server_socket;
  133. }
  134.  
  135. //LAB4
  136.  
  137. #include <stdio.h>
  138. #include <stdlib.h>
  139. #include <errno.h>
  140. #include <sys/socket.h>
  141. #include <arpa/inet.h>
  142. #include <unistd.h>
  143. #include <string.h>
  144.  
  145. #include "../debug/debug.h"
  146. #include "../cmdline/server_cmdline.h"
  147.  
  148. #define PORT_LIMIT  1 << 16
  149.  
  150. int setup_tcp_server(uint16_t port);
  151. int read_string_from_socket(
  152.     int tcp_client_socket,
  153.     char *buffer,
  154.     size_t buffer_size);
  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.     int port = args.porto_arg;
  165.     if (port <= 0 || port >= PORT_LIMIT) {
  166.         fprintf(stderr, "Invalid port (%d)\n", port);
  167.         return 44;
  168.     }
  169.  
  170.     int tcp_server_socket = setup_tcp_server(port);
  171.  
  172.     // TCP IPv4: "accept" 1 cliente (bloqueante)
  173.     char tcp_client_string_ip[20];
  174.     struct sockaddr_in tcp_client_endpoint;
  175.     socklen_t tcp_client_endpoint_length = sizeof(struct sockaddr_in);
  176.     int tcp_client_socket;
  177.  
  178.     while(1){
  179.         printf("à espera da ligação do cliente... "); fflush(stdout);
  180.         if ((tcp_client_socket = accept(
  181.             tcp_server_socket,
  182.             (struct sockaddr *) &tcp_client_endpoint,
  183.             &tcp_client_endpoint_length)) == -1){
  184.             ERROR(54, "Can't accept client");
  185.         }
  186.            
  187.         printf("ok. \n");          
  188.         printf("cliente: %s@%d\n",
  189.             inet_ntop(
  190.                 AF_INET,
  191.                 &tcp_client_endpoint.sin_addr,
  192.                 tcp_client_string_ip,
  193.                 sizeof(tcp_client_string_ip)),
  194.             htons(tcp_client_endpoint.sin_port));
  195.  
  196.         sleep(2);
  197.  
  198.         // TCP IPv4: variáveis auxiliares para send() / recv()
  199.         char buffer[100];
  200.  
  201.         int read_result = read_string_from_socket(
  202.             tcp_client_socket,
  203.             buffer,
  204.             sizeof(buffer));
  205.  
  206.         if (read_result != 0) {
  207.             fprintf(stderr, "Client closed connection!\n");
  208.             if (close(tcp_client_socket) == -1){
  209.                 ERROR(55, "Can't close tcp_client_socket (IPv4)");
  210.             }
  211.             continue;
  212.         }
  213.  
  214.         printf("String: %s\n", buffer);
  215.  
  216.         read_result = read_string_from_socket(
  217.             tcp_client_socket,
  218.             buffer,
  219.             sizeof(buffer));
  220.  
  221.         if (read_result != 0) {
  222.             fprintf(stderr, "Client closed connection!\n");
  223.             if (close(tcp_client_socket) == -1){
  224.                 ERROR(55, "Can't close tcp_client_socket (IPv4)");
  225.             }
  226.             continue;
  227.         }
  228.  
  229.         printf("String: %s\n", buffer);
  230.  
  231.         // TCP IPv4: fecha socket (client)
  232.         if (close(tcp_client_socket) == -1){
  233.             ERROR(55, "Can't close tcp_client_socket (IPv4)");
  234.         }
  235.     }
  236.            
  237.     // TCP IPv4: fecha socket (server)
  238.     if (close(tcp_server_socket) == -1)
  239.         ERROR(56, "Can't close tcp_server_socket (IPv4)"); 
  240.     printf("ligação fechada. ok. \n");
  241.  
  242.     // libertar recurso (cmdline_parser)
  243.     cmdline_parser_free(&args);
  244.  
  245.     exit(0);
  246. }
  247.  
  248. int read_string_from_socket(
  249.     int tcp_client_socket,
  250.     char *buffer,
  251.     size_t buffer_size){
  252.  
  253.     ssize_t tcp_read_bytes;
  254.     // TCP IPv4: "recv" do cliente (bloqueante)
  255.     printf("à espera de dados do cliente... "); fflush(stdout);
  256.     if ((tcp_read_bytes = recv(
  257.         tcp_client_socket,
  258.         buffer,
  259.         buffer_size - 1,
  260.         0)) == -1)
  261.         ERROR(57, "Can't recv from client");
  262.     printf("ok.  (%d bytes sent)\n", (int)tcp_read_bytes);
  263.  
  264.     buffer[tcp_read_bytes] = '\0';
  265.  
  266.     return tcp_read_bytes > 0 ? 0 : -1;
  267. }
  268.  
  269. int setup_tcp_server(uint16_t port){
  270.     // TCP IPv4: cria socket
  271.     int tcp_server_socket;
  272.     if ((tcp_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  273.         ERROR(51, "Can't create tcp_server_socket (IPv4)");
  274.  
  275.     // TCP IPv4: bind a IPv4/porto  
  276.     struct sockaddr_in tcp_server_endpoint;
  277.     memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));   
  278.     tcp_server_endpoint.sin_family = AF_INET;
  279.     tcp_server_endpoint.sin_addr.s_addr = htonl(INADDR_ANY);        // Todas as interfaces de rede
  280.     tcp_server_endpoint.sin_port = htons(port);     // Server port
  281.     if (bind(tcp_server_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
  282.         ERROR(52, "Can't bind @tcp_server_endpoint");
  283.  
  284.     // TCP IPv4: "listen" por clientes
  285.     int tcp_max_simultaneous_clients = 1;          
  286.     if (listen(tcp_server_socket, tcp_max_simultaneous_clients)  == -1)
  287.         ERROR(53, "Can't listen for %d clients", tcp_max_simultaneous_clients);
  288.  
  289.     return tcp_server_socket;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement