Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.10 KB | None | 0 0
  1. /*============================== Servidor basico UDP ==========================
  2.   Este servidor UDP destina-se a mostrar os conteudos dos datagramas recebidos.
  3.   O porto de escuta encontra-se definido pela constante SERV_UDP_PORT.
  4.   Assume-se que as mensagens recebida sao cadeias de caracteres (ou seja,
  5.   "strings").
  6. ===============================================================================*/
  7.  
  8. #include <stdio.h>
  9. #include <winsock.h>
  10.  
  11. #define SERV_UDP_PORT 6000
  12. #define BUFFERSIZE     4096
  13.  
  14. void Abort(char *msg);
  15.  
  16. /*________________________________ main ________________________________________
  17. */
  18.  
  19. int main( int argc , char *argv[] )
  20. {
  21.     SOCKET sockfd;
  22.     int iResult, nbytes;
  23.     struct sockaddr_in serv_addr;
  24.     char buffer[BUFFERSIZE];
  25.     WSADATA wsaData;
  26.     unsigned int source_port;
  27.     char source_ip[20];
  28.     /*=============== INICIA OS WINSOCKS ==============*/
  29.  
  30.     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  31.     if (iResult != 0) {
  32.         printf("WSAStartup failed: %d\n", iResult);
  33.         getchar();
  34.         exit(1);
  35.     }
  36.  
  37.     /*============ CRIA O SOCKET PARA RECEPCAO/ENVIO DE DATAGRAMAS UDP ============*/
  38.  
  39.     if((sockfd = socket( PF_INET , SOCK_DGRAM , 0)) == INVALID_SOCKET)
  40.         Abort("Impossibilidade de abrir socket");
  41.  
  42.     /*=============== ASSOCIA O SOCKET AO  ENDERECO DE ESCUTA ===============*/
  43.  
  44.     /*Define que pretende receber datagramas vindos de qualquer interface de
  45.     rede, no porto pretendido*/
  46.  
  47.     memset( (char*)&serv_addr , 0, sizeof(serv_addr) );
  48.     serv_addr.sin_family = AF_INET; /*Address Family: Internet*/
  49.     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  /*Host TO Network Long*/
  50.     serv_addr.sin_port = htons(SERV_UDP_PORT);  /*Host TO Network Short*/
  51.  
  52.     /*Associa o socket ao porto pretendido*/
  53.  
  54.     if(bind( sockfd , (struct sockaddr *)&serv_addr , sizeof(serv_addr)) == SOCKET_ERROR)
  55.         Abort("Impossibilidade de registar-se para escuta");
  56.  
  57.  
  58.     /*================ PASSA A ATENDER CLIENTES INTERACTIVAMENTE =============*/
  59.  
  60.     while(1){
  61.  
  62.         fprintf(stderr,"<SER1>Esperando datagram...\n");
  63.        
  64.         length_addr = sizeof(cli_addr);
  65.         nbytes=recvfrom(sockfd , buffer , sizeof(buffer) , 0 , (struct sockaddr * ) , &cli_addr, &length_addr);
  66.         if(nbytes == SOCKET_ERROR)
  67.             Abort("Erro na recepcao de datagrams");
  68.  
  69.         buffer[nbytes]='\0'; /*Termina a cadeia de caracteres recebidos com '\0'*/
  70.        
  71.         source_port = ntohs (cli_addr.sin_port);
  72.         strcpy ( source_ip, (char *) inet_ntoa ( cli_addr.sin_addr));
  73.         printf("\n<SER1>Mensagem recebida {%s}\n",buffer);
  74.  
  75.         nbytes = sendto(sockfd, buffer, strlen(buffer), 0 , (struct sockaddr *)&cli_addr.sizeof(cli_addr));
  76.         if(nbytes == SOCKET_ERROR){
  77.             printf("\n<SER1>Error ao reenviar a mensagem ao cliente\n");
  78.         }
  79.        
  80.     }
  81.    
  82. }
  83.  
  84. /*________________________________ Abort________________________________________
  85.   Mostra uma mensagem de erro e o código associado ao ultimo erro com Winsocks.
  86.   Termina a aplicacao com "exit status" a 1 (constante EXIT_FAILURE)
  87. ________________________________________________________________________________*/
  88.  
  89. void Abort(char *msg)
  90. {
  91.  
  92.     fprintf(stderr,"<SERV>Erro fatal: <%s> (%d)\n",msg, WSAGetLastError());
  93.     exit(EXIT_FAILURE);
  94.  
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement