piffy

TCP_echo server (C)

Aug 6th, 2015
406
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7.  
  8. #define BUFFER_SIZE 1024
  9. void on_error(char *s) { fprintf(stderr,"%s\n",s); fflush(stderr); exit(1); }
  10.  
  11. int main (int argc, char *argv[]) {
  12.   if (argc != 2) on_error("Uso: tcp_echo porta\n");
  13.  
  14.   int port = atoi(argv[1]);/** Conversione numero **/
  15.  
  16.   int server_fd, client_fd, err;
  17.   struct sockaddr_in server, client;
  18.   char buf[BUFFER_SIZE];
  19.  
  20.   server_fd = socket(AF_INET, SOCK_STREAM, 0);
  21.   if (server_fd < 0) on_error("Non ho potuto creare il socket\n");
  22.  
  23.   server.sin_family = AF_INET;                /** Famiglia internet **/
  24.   server.sin_port = htons(port);              /** Conversione numero **/
  25.   server.sin_addr.s_addr = htonl(INADDR_ANY); /** Accetta da qualsiasi IP **/
  26.  
  27.   int opt_val = 1;
  28.   setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);
  29.  
  30.   err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
  31.   if (err < 0) on_error("Non ho potuto fare il bind del socket\n");
  32.  
  33.   err = listen(server_fd, 128);
  34.   if (err < 0) on_error("Non ho potuto mettermi in ascolto sul socket\n");
  35.  
  36.   printf("Il server e' in ascolto sulla porta %d\n", port);
  37.  
  38.   while (1) {
  39.     socklen_t client_len = sizeof(client);
  40.     client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
  41.     /** Comunicazione accettata, ora abbiamo il socket del client **/
  42.  
  43.     if (client_fd < 0) on_error("Non riesco a stabilire una nuova connessione\n");
  44.  
  45.     while (1) { /** Continua all'infinito **/
  46.       int read = recv(client_fd, buf, BUFFER_SIZE, 0);
  47.  
  48.       if (!read) break; // fine lettura
  49.       if (read < 0) on_error("Errore nella lettura dal client\n");
  50.  
  51.       err = send(client_fd, buf, read, 0);
  52.       if (err < 0) on_error("Errore nella scrittura verso il client\n");
  53.     }
  54.   }
  55.  
  56.   return 0;
  57. }
RAW Paste Data