home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / GianuzziV / SO1 / WinUDPrecv.c < prev    next >
C/C++ Source or Header  |  2005-03-28  |  3KB  |  103 lines

  1. /*********************************************************
  2. *                                                        *
  3. *  UDPrecv.cpp     (in coppia con UDPsend)               *
  4. *                                                        *
  5. *  riceve in loop da porta UDP 3123 un messaggio         *
  6. *  (fino a 9 caratteri) e lo stampa                      *
  7. *                                                        *
  8. *  Compilato con MS Visual C++ 6.0, va linkato           *
  9. *  con ws2_32.lib                                        *
  10. *                                                        *
  11. *  Per usare i socket occorre inizializzare prima        *
  12. *  la libreria WSA, che va poi chiusa prima di terminare *
  13. *  il processo. L'errore eventualmente generato durante  *
  14. *  una chiamata a una funzione sui socket si trova       *
  15. *  usando la funzione WSAGetLastError()                  *
  16. *  Il parametro ritornato non va confrontato con -1      *
  17. *  come in Linux, ma con apposite costanti.              *
  18. *                                                        *
  19. **********************************************************/
  20.  
  21. #include <stdio.h>
  22. #include "winsock2.h"
  23. #include <stdlib.h>
  24. #include <signal.h>
  25.  
  26. #define PORTNUM         3123          // Port number
  27. #define HOSTNAME        "localhost"   // Server name string
  28.  
  29. SOCKET sock = INVALID_SOCKET; 
  30. int num=0;
  31.  
  32. void  intr(int numsig)
  33. {
  34.     printf("ricevuti %d messaggi  \n", num);
  35.     closesocket(sock);
  36.     WSACleanup();
  37. }
  38.  
  39. int main(int argc, char* argv[])
  40. {
  41.  
  42.  
  43.   SOCKADDR_IN local_sin; 
  44.   WSADATA WSAData;   
  45.   char szClient[12];
  46.   int ret;
  47.  
  48.   signal (SIGTERM, intr);
  49.  
  50.     // Initiate Windows Sockets. 
  51.     if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
  52.     {
  53.         printf ("WSAStartup failed. Error: %d\n", WSAGetLastError ());
  54.         exit(1);
  55.     }
  56.  
  57. // apertura del socket
  58.   if ((sock=socket (AF_INET, SOCK_DGRAM, 0))== INVALID_SOCKET)
  59.   {
  60.       printf ("Allocating socket failed. Error: %d", WSAGetLastError ());
  61.       WSACleanup ();
  62.       exit(1);
  63.   }
  64.  
  65. // Inizializza il socket locale con le informazioni sull'indirizzo
  66.     local_sin.sin_family = AF_INET;
  67.     local_sin.sin_port = htons (PORTNUM);  
  68.     local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
  69.  
  70. // Associo l'indirizzo locale con WinSocket.
  71.     if (bind (sock, (struct sockaddr *) &local_sin, sizeof (local_sin)) == SOCKET_ERROR) 
  72.     {
  73.         printf ("Bind failed. Error: %d", WSAGetLastError ());
  74.         WSACleanup ();
  75.         exit(2);
  76.     }
  77.  
  78.     for (;;)
  79.     {
  80.         printf("aspetto di ricervere da porta %d ...\n", PORTNUM);
  81.         printf("\n------\n");
  82.         ret=recvfrom(sock, szClient, sizeof (szClient), 0, NULL, NULL);    
  83.  
  84.         szClient[ret]='\0';
  85.         printf("Ricevuto %d caratteri: \n%s \n\n", ret, szClient);
  86.         num++;
  87.  
  88.         if (ret<0)
  89.         {
  90.             printf("recv failed: error %d \n", WSAGetLastError());
  91.             closesocket(sock);
  92.             WSACleanup();
  93.             exit(1);
  94.         }
  95.     }
  96.    
  97.         closesocket(sock);
  98.         WSACleanup();
  99.         return TRUE;
  100. }
  101.  
  102.  
  103.