Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.50 KB | None | 0 0
  1. /*Compilar - gcc clienteudp.c -o clienteudp
  2.   Executar - ./clienteudp 127.0.0.1 mensagem
  3. */
  4.  
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <netdb.h>
  10. #include <stdio.h>
  11. #include <unistd.h>
  12. #include <string.h> /* memset() */
  13. #include <sys/time.h> /* select() */
  14. #include <iostream>
  15.  
  16.  
  17. #define REMOTE_SERVER_PORT 1500
  18. #define MAX_MSG 100
  19. #define LOCAL_SERVER_PORT 1200
  20.  
  21. using namespace std;
  22.  
  23. void cliente(int argc, char *argv[]) {
  24.  
  25.   int sd, rc, i;
  26.   struct sockaddr_in cliAddr, remoteServAddr;
  27.   struct hostent *h;
  28.  
  29.   /* get server IP address (no check if input is IP address or DNS name */
  30.   h = gethostbyname(argv[1]);
  31.   if(h==NULL) {
  32.     printf("%s: unknown host '%s' \n", argv[0], argv[1]);
  33.     return;
  34.   }
  35.  
  36.   printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name,
  37.    
  38.   inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));
  39.  
  40.   remoteServAddr.sin_family = h->h_addrtype;
  41.  
  42.   memcpy((char *) &remoteServAddr.sin_addr.s_addr,
  43.    
  44.   h->h_addr_list[0], h->h_length);
  45.  
  46.   remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);
  47.  
  48.   /* socket creation */
  49.   sd = socket(AF_INET,SOCK_DGRAM,0);
  50.   if(sd<0) {
  51.     printf("%s: cannot open socket \n",argv[0]);
  52.     return;
  53.   }
  54.  
  55.   /* bind any port */
  56.   cliAddr.sin_family = AF_INET;
  57.   cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  58.   cliAddr.sin_port = htons(0);
  59.  
  60.   rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
  61.   if(rc<0) {
  62.     printf("%s: cannot bind port\n", argv[0]);
  63.     return;
  64.   }
  65.  
  66.   char mensagem[50];
  67.   /* send data */
  68.   for(;;) {
  69.     cin >> mensagem;
  70.     rc = sendto(sd, mensagem, strlen(mensagem)+1, 0,
  71.         (struct sockaddr *) &remoteServAddr,
  72.         sizeof(remoteServAddr));
  73.  
  74.     if(rc<0) {
  75.       printf("%s: cannot send data %d \n",argv[0],i-1);
  76.       close(sd);
  77.       return;
  78.     }
  79.   }  
  80.   return;
  81.  
  82. }
  83.  
  84. void servidor(int argc, char *argv[]) {
  85.  
  86.   int sd, rc, n;
  87.   socklen_t cliLen;
  88.   struct sockaddr_in cliAddr, servAddr;
  89.   char msg[MAX_MSG];
  90.  
  91.   /* socket creation */
  92.   sd=socket(AF_INET, SOCK_DGRAM, 0);
  93.   if(sd<0) {
  94.     printf("%s: cannot open socket \n",argv[0]);
  95.     return;
  96.   }
  97.  
  98.   /* bind local server port */
  99.   servAddr.sin_family = AF_INET;
  100.   servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  101.   servAddr.sin_port = htons(LOCAL_SERVER_PORT);
  102.   rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
  103.   if(rc<0) {
  104.     printf("%s: cannot bind port number %d \n",
  105.      argv[0], LOCAL_SERVER_PORT);
  106.     return;
  107.   }
  108.  
  109.   printf("%s: waiting for data on port UDP %u\n",
  110.      argv[0],LOCAL_SERVER_PORT);
  111.  
  112.   /* server infinite loop */
  113.   while(1) {
  114.    
  115.     /* init buffer */
  116.     memset(msg,0x0,MAX_MSG);
  117.  
  118.  
  119.     /* receive message */
  120.     cliLen = sizeof(cliAddr);
  121.     n = recvfrom(sd, msg, MAX_MSG, 0,
  122.      (struct sockaddr *) &cliAddr, &cliLen);
  123.  
  124.     if(n<0) {
  125.       printf("%s: cannot receive data \n",argv[0]);
  126.       continue;
  127.     }
  128.      
  129.     /* print received message */
  130.     printf("Mensagem de Usuário 2: %s \n",msg);
  131.    
  132.   }
  133.  
  134.   return;
  135. }
  136.  
  137. int main(int argc, char *argv[]){  
  138.   printf("Uso do programa: A todo momento, mensagens do outro usuário\n+estarão disponíveis na UI. Envie sua mensagem a qualquer \n+momento. ");
  139.    pid_t childPID;
  140.   int var_lcl = 0;
  141.   childPID = fork();
  142.   if(childPID >= 0){
  143.     if(childPID == 0){
  144.       cliente(argc,argv);
  145.     }else{            
  146.       servidor(argc,argv);
  147.     }
  148.   }else{
  149.     printf("\n Fork failed, quitting...\n");
  150.     return 1;
  151.   }
  152.   return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement