Advertisement
Guest User

udpclient.c

a guest
Apr 28th, 2016
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 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. int main (int argc, char **argv) {
  19.    
  20.     int sockfd, port = 1234, Pflag = 0, ch;
  21.     int status;
  22.     int rcv_len;
  23.     char rcv_buf[BUFF_SIZE], send_buf[BUFF_SIZE];
  24.     struct sockaddr_in servaddr;
  25.     struct addrinfo hints, *res;
  26.     socklen_t serv_len;
  27.     char *host;
  28.     int i;
  29.    
  30.     if (argc < 2) {
  31.         error("Usage: ./udpklijent [-p port] server_IP");
  32.     }
  33.    
  34.     while ((ch = getopt(argc, argv, "p")) != -1){
  35.         switch(ch){
  36.             case 'p':
  37.                 Pflag = 1;
  38.                 break;
  39.             default:
  40.                 error("Usage: ./udpklijent [-p port] server_IP");
  41.                 break;
  42.         }
  43.     }
  44.    
  45.     host = argv[argc - 1];
  46.    
  47.     sockfd = socket (AF_INET, SOCK_DGRAM, 0);
  48.     if (sockfd < 0)
  49.         error("Problem s otvaranjem socketa");
  50.    
  51.     memset(&servaddr, 0, sizeof(servaddr));
  52.     servaddr.sin_family = AF_INET; 
  53.     inet_pton(AF_INET, host , &servaddr.sin_addr);
  54.  
  55.     if (Pflag) {    
  56.         memset(&hints, 0, sizeof(hints));
  57.         hints.ai_family = AF_INET;
  58.         hints.ai_socktype = SOCK_DGRAM;
  59.         hints.ai_flags = AI_PASSIVE;
  60.         if (getaddrinfo(NULL, argv[2], &hints, &res) < 0)
  61.             error("Problem s getaddrinfo()");
  62.         servaddr.sin_port = ((struct sockaddr_in *)res->ai_addr)->sin_port;
  63.     }
  64.     else {
  65.         servaddr.sin_port = htons(port);
  66.     }
  67.    
  68.     serv_len = sizeof(struct sockaddr);
  69.    
  70.     while (1) {
  71.        
  72.         memset(send_buf, 0, BUFF_SIZE);
  73.         memset(rcv_buf, 0, BUFF_SIZE);
  74.        
  75.         // Citaj s standardnog ulaza
  76.         status = scanf("%s", send_buf);
  77.        
  78.         // Ako je duljina buffera 0, posalji serveru prazan datagram
  79.         if (status == EOF) {
  80.             if( sendto(sockfd, 0, 0, 0, (struct sockaddr *) &servaddr, serv_len) < 0)
  81.                 error("Problem s slanjem praznog datagrama");
  82.             return 0;
  83.         } else {
  84.        
  85.             if (sendto( sockfd, send_buf, strlen(send_buf) + 1, 0,
  86.                     (struct sockaddr *) &servaddr, serv_len) < 0)
  87.                 error("Problem s slanjem datagrama");
  88.            
  89.            
  90.             if ((rcv_len = recvfrom( sockfd, rcv_buf, BUFF_SIZE, 0,
  91.                        (struct sockaddr *) &servaddr, &serv_len)) < 0)
  92.                 error("Problem s primanjem datagrama");
  93.            
  94.             if (rcv_buf[0] == 0x00)
  95.                 printf("posluzitelj nije pronasao odgovor\n");
  96.            
  97.             if (rcv_buf[0] == 0x01) {
  98.                
  99.                 for (i=1; i<rcv_len - 1; i++) {
  100.                
  101.                     printf("%X ", rcv_buf[i]);
  102.                
  103.                 }
  104.                
  105.                 printf("\n");
  106.                
  107.             }
  108.            
  109.             if (rcv_buf[0] == 0x02) {
  110.                
  111.                 memmove(rcv_buf, rcv_buf + 1, rcv_len - 1);
  112.                 printf("%s\n", rcv_buf);
  113.             }  
  114.         }
  115.            
  116.            
  117.     }
  118.    
  119.     freeaddrinfo(res);
  120.     close(sockfd);
  121.    
  122.     return 0;
  123.    
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement