Advertisement
daemonio

alfaclient.c

Dec 20th, 2012
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.84 KB | None | 0 0
  1. /* [alfaclient.c]
  2.  * Cliente para o chatserv.
  3.  *
  4.  * [Uso]
  5.  * $ gcc -o alfaclient alfaclient.c
  6.  * $ ./alfaclient localhost porto apelido
  7.  *
  8.  * ex
  9.  *
  10.  * $ ./alfaclient localhost 31337 alfa
  11.  *
  12.  * ** Pressione qualquer tecla para começar a digitar.
  13.  * ** As mensagens recebidas aparecerão imediatamente na tela.
  14.  *
  15.  * Versão 1.0 by daemonio @ Sat Dec 22 22:24:07 BRST 2012
  16.  *
  17.  **/
  18.  
  19. #include <stdio.h>
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <netinet/in.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <unistd.h>
  26. #include <netdb.h>
  27. #include <termios.h>
  28.  
  29. #define ENDSERV_LEN 100
  30. #define NICK_LEN 20
  31.  
  32. /* Cores no terminal*/
  33. #define COR_1 1
  34. #define COR_1_COD "\x1b\x5b\x33\x31\x3b\x31\x6d"
  35. #define COR_1_COD_FECHA "\x1b\x5b\x30\x6d"
  36.  
  37. #define COR_2 2
  38. #define COR_2_COD "\x1b\x5b\x33\x32\x3b\x31\x6d"
  39. #define COR_2_COD_FECHA "\x1b\x5b\x30\x6d"
  40.  
  41. void print_cor(char *msg, int usar_cor) ;
  42.  
  43. void print_cor(char *msg, int cor) {
  44.     switch(cor) {
  45.         case 0:
  46.             printf("%s", msg) ;
  47.             break ;
  48.  
  49.         case COR_1:
  50.             printf(COR_1_COD"%s"COR_1_COD_FECHA, msg) ;
  51.             break ;
  52.  
  53.         case COR_2:
  54.             printf(COR_2_COD"%s"COR_2_COD_FECHA, msg) ;
  55.             break ;
  56.     }
  57. }
  58.  
  59. int main(int argc, char *argv[]) {
  60.     char endServer[ENDSERV_LEN];
  61.     char nome_cliente[NICK_LEN];
  62.     char mensagem[BUFSIZ];
  63.  
  64.     struct sockaddr_in addr ;
  65.     struct hostent *hostPtr;
  66.  
  67.     struct timeval select_time ;
  68.     fd_set select_set ;
  69.  
  70.     int fd ; /* socket */
  71.     int t ;
  72.  
  73.     /* Usados para leitura non-block de getchar(). */
  74.     struct termios initial_settings, new_settings;
  75.  
  76.     if (argc != 4) {
  77.         printf("cliente <ip endereco> <porto> <nome de utilizador>\n");
  78.         return -1;
  79.     }
  80.  
  81.     endServer[0]=0; nome_cliente[0]=0 ;
  82.  
  83.     /* Copia do endereço. strncat evita que os dados
  84.      * ultrapassem o buffer. */
  85.     strncat(endServer, argv[1], sizeof endServer);
  86.  
  87.     /* Copia do endereço. strncat evita que os dados
  88.      * ultrapassem o buffer. */
  89.     strncat(nome_cliente, argv[3], sizeof nome_cliente);
  90.  
  91.     if ((hostPtr = gethostbyname(endServer)) == 0) {
  92.         herror("gethostbyname") ;
  93.         return -1 ;
  94.     }
  95.  
  96.     bzero((void *) &addr, sizeof(addr));
  97.     addr.sin_family = AF_INET; /* Protocolo */
  98.     addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr;
  99.     addr.sin_port = htons((short) atoi(argv[2])); /* Porto */
  100.  
  101.     /* Abre um novo socket. */
  102.     if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
  103.         perror("socket") ;
  104.         return -1 ;
  105.     }
  106.  
  107.     /* Conecta no servidor. */
  108.     if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
  109.         perror("socket") ;
  110.         return -1 ;
  111.     }
  112.     if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0) {
  113.         perror("connect") ;
  114.         return -1 ;
  115.     }
  116.  
  117.     /* Obtem configuracoes antigas do terminal. */
  118.     tcgetattr(0,&initial_settings);
  119.  
  120.     /* Seta novas configuracoes do terminal. */
  121.     new_settings = initial_settings;
  122.     new_settings.c_lflag &= ~ICANON;
  123.     new_settings.c_lflag &= ~ECHO;
  124.     new_settings.c_lflag &= ~ISIG;
  125.     new_settings.c_cc[VMIN] = 0;
  126.     new_settings.c_cc[VTIME] = 0;
  127.  
  128.     /* Envia apelido. */
  129.     send(fd, nome_cliente, strlen(nome_cliente),0);
  130.  
  131.     /* Loop principal. */
  132.     while(1) {
  133.         /* Seta o socket em select. */
  134.         FD_ZERO(&select_set) ;
  135.         FD_SET(fd, &select_set) ;
  136.  
  137.         /* Sem tempo de block para select. */
  138.         select_time.tv_sec = 0 ;
  139.         select_time.tv_usec = 0 ;
  140.  
  141.         if( (t=select(FD_SETSIZE, &select_set, NULL, NULL, &select_time)) < 0 ) {
  142.             perror("select") ;
  143.             return -1 ;
  144.         }
  145.  
  146.         /* Aqui temos algo no socket. */
  147.         if(t > 0) {
  148.             if(FD_ISSET(fd, &select_set)) {
  149.                 int b ;
  150.                 b = recv(fd, mensagem, sizeof mensagem,0);
  151.  
  152.                 /* Mostra mensagem na tela. */
  153.                 mensagem[b] = '\0' ;
  154.                 print_cor(mensagem, COR_1) ;
  155.  
  156.                 fflush(stdout) ;
  157.             }
  158.         }
  159.  
  160.         /* Leitura non-block em getchar(). */
  161.         tcsetattr(0, TCSANOW, &new_settings);
  162.         t = getchar();
  163.         tcsetattr(0, TCSANOW, &initial_settings);
  164.  
  165.         /* Retorno não EOF indica um tecla valida. */
  166.         if(t != EOF) {
  167.             /* Mostra o prompt de mensagem. */
  168.             print_cor("Digite mensagem: ", COR_2) ;
  169.             fgets(mensagem, sizeof mensagem, stdin) ;
  170.  
  171.             /* Quit encerra o loop principal. */
  172.             if(strcmp(mensagem, "quit\n") == 0) {
  173.                 break ;
  174.             }
  175.  
  176.             /* Envia a mensagem. */
  177.             if(mensagem[0] != '\n') { /* Nao envia um ENTER isolado. */
  178.                 send(fd, mensagem, strlen(mensagem),0);
  179.             }
  180.         }
  181.     }
  182.  
  183.     close(fd);
  184.     return 0 ;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement