piffy

TCP_echo server (C++/Win)

Aug 6th, 2015
314
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**Copyright (c) 2015 Mathias Buus, Marcello Missiroli & Remy Lebeau */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <winsock.h>
  5.  
  6. #define BUFFER_SIZE 1024
  7.  
  8. void on_error(char *s, int *errCode = NULL)
  9. {
  10.     int err = (errCode) ? *errCode : WSAGetLastError();
  11.     fprintf(stderr, "%s: %d\n", s, err);
  12.     fflush(stderr);
  13.     WSACleanup();
  14.     exit(1);
  15. }
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.     WSADATA wsadata;
  20.     SOCKET server_fd, client_fd;
  21.     struct sockaddr_in server, client;
  22.     int port = 6666, err;
  23.     char buf[BUFFER_SIZE];
  24.    
  25.     /** Controllo linea di comando **/
  26.     if (argc > 2 ) on_error("Uso: tcp_echo [porta]\n");
  27.     if (argc == 2)  port = atoi(argv[1]);/** Conversione numero **/
  28.    
  29.     /** Inizializzazione Winsock **/
  30.     err = WSAStartup(MAKEWORD(2,2), &wsadata);
  31.     if (err != 0)
  32.         on_error("Errore in WSAStartup", &err);
  33.  
  34.     /** Inizializzazione socket **/
  35.     server_fd = socket(AF_INET, SOCK_STREAM, 0);
  36.     if (server_fd == INVALID_SOCKET)
  37.         on_error("Non ho potuto creare il socket");
  38.  
  39.     /** Configurazione socket **/
  40.     memset(&server, 0, sizeof(server)); /** Azzeramento **/
  41.     server.sin_family = AF_INET;        /** Famiglia **/
  42.     server.sin_port = htons(port);      /** Conversione numero **/
  43.     server.sin_addr.s_addr = INADDR_ANY;/** Accetta qualsiasi IP **/
  44.  
  45.     /** bind & listen **/
  46.     const BOOL opt_val = TRUE;
  47.     setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt_val, sizeof(opt_val));
  48.     err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
  49.     if (err == SOCKET_ERROR)
  50.         on_error("Non ho potuto fare il bind del socket");
  51.     err = listen(server_fd, 1);
  52.     if (err == SOCKET_ERROR)
  53.         on_error("Non ho potuto mettermi in ascolto sul socket");
  54.  
  55.     printf("Server in ascolto sulla porta %d\n", port);
  56.  
  57.     while (1)
  58.     {
  59.         int client_len = sizeof(client);
  60.         client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
  61.  
  62.         if (client_fd == INVALID_SOCKET)
  63.             on_error("Non riesco a stabilire una nuova connessione");
  64.  
  65.         bool continua= true;
  66.         do
  67.         {
  68.             /** Leggi dati (read = numero di byte ricevuti) **/
  69.             int read = recv(client_fd, buf, BUFFER_SIZE, 0);
  70.  
  71.             if (read == 0)
  72.                 break; /** Fine connessione **/
  73.  
  74.             if (read == SOCKET_ERROR)
  75.             {
  76.                 err = WSAGetLastError();
  77.                 if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
  78.                     on_error("Errore nella lettura dal client", &err);
  79.                 break;
  80.             }
  81.  
  82.             /** Trasmetti i dati ricevuti **/
  83.                 int sent = send(client_fd, buf, read, 0);
  84.                 if (sent == SOCKET_ERROR)
  85.                 {
  86.                     err = WSAGetLastError();
  87.                     if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
  88.                         on_error("Errore nella scrittura verso il client", &err);
  89.                 }
  90.              
  91.         }
  92.         while (continua);
  93.  
  94.         closesocket(client_fd);
  95.     }
  96.  
  97.     WSACleanup();
  98.     return 0;
  99. }
RAW Paste Data