Advertisement
Guest User

udpserver.c

a guest
Apr 28th, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.91 KB | None | 0 0
  1. #include <netinet/in.h>
  2. #include <arpa/inet.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #define BUFF_SIZE 255
  12.  
  13. void error (char *err_msg) {
  14.     perror(err_msg);
  15.     exit(1);
  16. }
  17.  
  18.  
  19. int main (int argc, char **argv) {
  20.    
  21.     struct sockaddr_in my_addr;
  22.     struct sockaddr_in their_addr;
  23.     struct addrinfo hints, *res;
  24.     char rcv_buf[BUFF_SIZE], send_buf[BUFF_SIZE], addrstr[BUFF_SIZE];
  25.     int sockfd, ch, Pflag = 0, port = 1234;
  26.     socklen_t addr_len = sizeof(struct sockaddr);
  27.     int rcv_len;
  28.     int IPv4flag, IPv6flag;
  29.     int i = 0;
  30.     unsigned int *paddr;
  31.    
  32.     if (argc != 1 && argc != 3)
  33.         error("Usage: ./udpserver [-p port]");
  34.    
  35.     while ((ch = getopt(argc, argv, "p")) != -1){
  36.         switch(ch){
  37.             case 'p':
  38.                 Pflag = 1;
  39.                 break;
  40.             default:
  41.                 error("Usage: ./udpserver [-p port]");
  42.                 break;
  43.         }
  44.     }
  45.    
  46.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  47.     if (sockfd < 0)
  48.         error("Problem s otvaranjem socketa"); 
  49.    
  50.     memset(&my_addr, 0, sizeof(my_addr));
  51.     my_addr.sin_family = AF_INET;
  52.     my_addr.sin_addr.s_addr = INADDR_ANY;
  53.    
  54.     if (Pflag) {    
  55.         memset(&hints, 0, sizeof(hints));
  56.         hints.ai_family = AF_INET;
  57.         hints.ai_socktype = SOCK_DGRAM;
  58.         hints.ai_flags = AI_PASSIVE;
  59.         if (getaddrinfo(NULL, argv[2], &hints, &res) < 0)
  60.             error("Problem s getaddrinfo()");
  61.         my_addr.sin_port = ((struct sockaddr_in *)res->ai_addr)->sin_port;
  62.     }
  63.     else {
  64.         my_addr.sin_port = htons(port);
  65.     }
  66.    
  67.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0)
  68.         error("Problem s bindanjem socketa");
  69.    
  70.     while (1) {
  71.        
  72.         IPv4flag = IPv6flag = 0;
  73.        
  74.         if ((rcv_len = recvfrom (sockfd, rcv_buf, BUFF_SIZE, 0,
  75.                        (struct sockaddr *)&their_addr, &addr_len)) < 0)          
  76.             error("Problem s primanjem datagrama");
  77.        
  78.         if (rcv_len == 0) {
  79.             return 0;
  80.         } else {
  81.            
  82.            
  83.             printf("%s\n", rcv_buf);
  84.            
  85.             // Brojac za duljinu adrese
  86.             int rcv_buf_addr_len = 0;
  87.            
  88.             for (i = 2; i < rcv_len; i++) {
  89.                    
  90.                     if(rcv_buf[i] == '\n') break;
  91.                     rcv_buf_addr_len++;
  92.             }
  93.            
  94.             char address[rcv_buf_addr_len];
  95.            
  96.             for(i = 0; i < rcv_buf_addr_len; i++) {
  97.                     address[i] = rcv_buf[i+2];
  98.             }
  99.            
  100.             if (rcv_buf[1] == '4') IPv4flag = 1;
  101.             if (rcv_buf[1] == '6') IPv6flag = 1;
  102.            
  103.             memset(&hints, 0, sizeof(hints));
  104.            
  105.             if (IPv4flag) {
  106.                 hints.ai_family = AF_INET;
  107.             }
  108.             if (IPv6flag) {
  109.                 hints.ai_family = AF_INET6;
  110.             }
  111.             hints.ai_flags |= AI_CANONNAME;
  112.            
  113.            
  114.             if (getaddrinfo(address, NULL, &hints, &res) < 0)
  115.                 error("Problem s getaddrinfo()");;
  116.            
  117.             memset(send_buf, 0, BUFF_SIZE);
  118.             memset(addrstr, 0, BUFF_SIZE);
  119.            
  120.             if (rcv_buf[0] == 'S') {
  121.                
  122.                 if (IPv4flag)
  123.                     inet_ntop(res->ai_family, &((struct sockaddr_in *)res->ai_addr)->sin_addr,
  124.                               addrstr, BUFF_SIZE);
  125.                 if (IPv6flag)
  126.                     inet_ntop(res->ai_family, &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr,
  127.                               addrstr, BUFF_SIZE);
  128.            
  129.                 strncpy(send_buf, "\x02", 1);
  130.                 strncpy(send_buf + 1, addrstr, sizeof(addrstr));    
  131.                          
  132.             }
  133.            
  134.             if (rcv_buf[0] == 'N') {
  135.                
  136.                 strncpy(send_buf, "\x01", 1);
  137.                
  138.                 if (IPv4flag) {
  139.                    
  140.                     struct sockaddr_in *p = (struct sockaddr_in *)
  141.                                             (res->ai_addr);
  142.                     paddr = &(p->sin_addr.s_addr);
  143.                     memcpy(addrstr, paddr, 4);
  144.                     strncpy(send_buf + 1, addrstr, sizeof(addrstr));
  145.                 }
  146.                    
  147.                 if (IPv6flag) {
  148.                
  149.                     struct sockaddr_in6 *p = (struct sockaddr_in6 *)
  150.                                              (res->ai_addr);
  151.                    
  152.                     sprintf(addrstr, "%s", p->sin6_addr.s6_addr);
  153.                    
  154.                     strncpy(send_buf + 1, addrstr, sizeof(addrstr));
  155.                
  156.                 }
  157.            
  158.             }
  159.            
  160.             if (sendto(sockfd, send_buf, strlen(send_buf) + 1, 0,
  161.                       (struct sockaddr *)&their_addr, addr_len) < 0)
  162.                 error("Problem s slanjem datagrama");  
  163.        
  164.         }
  165.        
  166.     }
  167.    
  168.     freeaddrinfo(res);
  169.     close(sockfd);
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement