Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* [alfaclient.c]
- * Cliente para o chatserv.
- *
- * [Uso]
- * $ gcc -o alfaclient alfaclient.c
- * $ ./alfaclient localhost porto apelido
- *
- * ex
- *
- * $ ./alfaclient localhost 31337 alfa
- *
- * ** Pressione qualquer tecla para começar a digitar.
- * ** As mensagens recebidas aparecerão imediatamente na tela.
- *
- * Versão 1.0 by daemonio @ Sat Dec 22 22:24:07 BRST 2012
- *
- **/
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <termios.h>
- #define ENDSERV_LEN 100
- #define NICK_LEN 20
- /* Cores no terminal*/
- #define COR_1 1
- #define COR_1_COD "\x1b\x5b\x33\x31\x3b\x31\x6d"
- #define COR_1_COD_FECHA "\x1b\x5b\x30\x6d"
- #define COR_2 2
- #define COR_2_COD "\x1b\x5b\x33\x32\x3b\x31\x6d"
- #define COR_2_COD_FECHA "\x1b\x5b\x30\x6d"
- void print_cor(char *msg, int usar_cor) ;
- void print_cor(char *msg, int cor) {
- switch(cor) {
- case 0:
- printf("%s", msg) ;
- break ;
- case COR_1:
- printf(COR_1_COD"%s"COR_1_COD_FECHA, msg) ;
- break ;
- case COR_2:
- printf(COR_2_COD"%s"COR_2_COD_FECHA, msg) ;
- break ;
- }
- }
- int main(int argc, char *argv[]) {
- char endServer[ENDSERV_LEN];
- char nome_cliente[NICK_LEN];
- char mensagem[BUFSIZ];
- struct sockaddr_in addr ;
- struct hostent *hostPtr;
- struct timeval select_time ;
- fd_set select_set ;
- int fd ; /* socket */
- int t ;
- /* Usados para leitura non-block de getchar(). */
- struct termios initial_settings, new_settings;
- if (argc != 4) {
- printf("cliente <ip endereco> <porto> <nome de utilizador>\n");
- return -1;
- }
- endServer[0]=0; nome_cliente[0]=0 ;
- /* Copia do endereço. strncat evita que os dados
- * ultrapassem o buffer. */
- strncat(endServer, argv[1], sizeof endServer);
- /* Copia do endereço. strncat evita que os dados
- * ultrapassem o buffer. */
- strncat(nome_cliente, argv[3], sizeof nome_cliente);
- if ((hostPtr = gethostbyname(endServer)) == 0) {
- herror("gethostbyname") ;
- return -1 ;
- }
- bzero((void *) &addr, sizeof(addr));
- addr.sin_family = AF_INET; /* Protocolo */
- addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr;
- addr.sin_port = htons((short) atoi(argv[2])); /* Porto */
- /* Abre um novo socket. */
- if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
- perror("socket") ;
- return -1 ;
- }
- /* Conecta no servidor. */
- if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
- perror("socket") ;
- return -1 ;
- }
- if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0) {
- perror("connect") ;
- return -1 ;
- }
- /* Obtem configuracoes antigas do terminal. */
- tcgetattr(0,&initial_settings);
- /* Seta novas configuracoes do terminal. */
- new_settings = initial_settings;
- new_settings.c_lflag &= ~ICANON;
- new_settings.c_lflag &= ~ECHO;
- new_settings.c_lflag &= ~ISIG;
- new_settings.c_cc[VMIN] = 0;
- new_settings.c_cc[VTIME] = 0;
- /* Envia apelido. */
- send(fd, nome_cliente, strlen(nome_cliente),0);
- /* Loop principal. */
- while(1) {
- /* Seta o socket em select. */
- FD_ZERO(&select_set) ;
- FD_SET(fd, &select_set) ;
- /* Sem tempo de block para select. */
- select_time.tv_sec = 0 ;
- select_time.tv_usec = 0 ;
- if( (t=select(FD_SETSIZE, &select_set, NULL, NULL, &select_time)) < 0 ) {
- perror("select") ;
- return -1 ;
- }
- /* Aqui temos algo no socket. */
- if(t > 0) {
- if(FD_ISSET(fd, &select_set)) {
- int b ;
- b = recv(fd, mensagem, sizeof mensagem,0);
- /* Mostra mensagem na tela. */
- mensagem[b] = '\0' ;
- print_cor(mensagem, COR_1) ;
- fflush(stdout) ;
- }
- }
- /* Leitura non-block em getchar(). */
- tcsetattr(0, TCSANOW, &new_settings);
- t = getchar();
- tcsetattr(0, TCSANOW, &initial_settings);
- /* Retorno não EOF indica um tecla valida. */
- if(t != EOF) {
- /* Mostra o prompt de mensagem. */
- print_cor("Digite mensagem: ", COR_2) ;
- fgets(mensagem, sizeof mensagem, stdin) ;
- /* Quit encerra o loop principal. */
- if(strcmp(mensagem, "quit\n") == 0) {
- break ;
- }
- /* Envia a mensagem. */
- if(mensagem[0] != '\n') { /* Nao envia um ENTER isolado. */
- send(fd, mensagem, strlen(mensagem),0);
- }
- }
- }
- close(fd);
- return 0 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement