piffy

UDP Server (C++/Win)

Aug 8th, 2015
358
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. #define NPACK 10
  8.  
  9. void on_error(char *s, int *errCode = NULL)
  10. {
  11.     int err = (errCode) ? *errCode : WSAGetLastError();
  12.     fprintf(stderr, "%s: %d\n", s, err);
  13.     fflush(stderr);
  14.     WSACleanup();
  15.     exit(1);
  16. }
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.       WSADATA wsadata;
  21.       struct sockaddr_in server, client;
  22.       int s, i, slen=sizeof(client), port=6666, err;
  23.       char buf[BUFFER_SIZE];
  24.  
  25.       /** Controllo linea di comando **/
  26.       if (argc >2 ) {
  27.     on_error("Uso: ./udp_server [porta]\n");
  28.         exit(1);
  29.       }
  30.       if (argc == 2) {port = atoi(argv[1]);}
  31.    
  32.     /** Inizializzazione Winsock **/
  33.     err = WSAStartup(MAKEWORD(2,2), &wsadata);
  34.     if (err != 0)
  35.         on_error("Errore in WSAStartup", &err);
  36.  
  37.       /** Creazione socket **/
  38.       if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
  39.          on_error("Non riesco a creare il socket");
  40.      
  41.       /** Impostazioni del socket del server */
  42.       memset((char *) &server, 0, sizeof(server)); /** Azzeramento **/
  43.       server.sin_family = AF_INET; /** Famiglia internet **/
  44.       server.sin_port = htons(port); /** Conversione numero **/
  45.       server.sin_addr.s_addr = htonl(INADDR_ANY); /** Accetta da qualsiasi IP **/
  46.  
  47.      /** Bind  **/
  48.      if (bind(s, (struct sockaddr *)&server, sizeof(server))==-1)
  49.          on_error("Non riesco a fare il bind");
  50.      else printf("In ascolto sulla porta %d\n",port);
  51.    
  52.       for (i=0; i<NPACK; i++) {
  53.         memset(buf, 0, BUFFER_SIZE);
  54.         /** Ricezione pacchetto **/
  55.         if (recvfrom(s, buf, BUFFER_SIZE, 0, (struct sockaddr *)&client, &slen)==-1)
  56.           on_error("Errore in ricezione");
  57.         printf("Pacchetto ricevuto da %s:%d\nDato: %s\n\n",
  58.            inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
  59.       }
  60.  
  61.     WSACleanup();
  62.     closesocket(s);
  63.     return 0;
  64. }
RAW Paste Data