chat

idk what is
git clone git://git.evenfri.xyz/chat.git
Log | Files | Refs

client.c (2264B)


      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <unistd.h>
      4 #include <poll.h>
      5 
      6 #include <sys/socket.h>
      7 #include <netinet/in.h>
      8 #include <arpa/inet.h>
      9 
     10 #define BUFFER_SIZE 1024
     11 
     12 int main(int argc, char *argv[]) {
     13   int fd;
     14   int n;
     15   int result;
     16   int message_size;
     17   struct sockaddr_in addr;
     18   struct pollfd fds[2];
     19   char buffer[BUFFER_SIZE];
     20   char message[BUFFER_SIZE];
     21   char *nickname;
     22 
     23   if (argc > 1) {
     24     nickname = argv[1];
     25   } else {
     26     nickname = "Client";
     27   }
     28 
     29   fd = socket(AF_INET, SOCK_STREAM, 0);
     30   if (fd == -1) {
     31     perror("socket");
     32     return 1;
     33   }
     34 
     35   memset(&addr, 0, sizeof(addr));
     36 
     37   addr.sin_family = AF_INET;
     38   addr.sin_port = htons(8080);
     39 
     40   if (inet_pton(AF_INET, "194.87.232.205", &addr.sin_addr) != 1) {
     41     fprintf(stderr, "invalid address\n");
     42     close(fd);
     43     return 1;
     44   }
     45 
     46   if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
     47     perror("connect");
     48     close(fd);
     49     return 1;
     50   }
     51 
     52   printf("connected\n");
     53   printf("> ");
     54   fflush(stdout);
     55 
     56   fds[0].fd = fd;
     57   fds[0].events = POLLIN;
     58 
     59   fds[1].fd = STDIN_FILENO;
     60   fds[1].events = POLLIN;
     61 
     62   while (1) {
     63     result = poll(fds, 2, -1);
     64 
     65     if (result == -1) {
     66       perror("poll");
     67       close(fd);
     68       return 1;
     69     }
     70 
     71     /*
     72      * Server sent something.
     73      */
     74     if (fds[0].revents & POLLIN) {
     75       n = recv(fd, buffer, sizeof(buffer) - 1, 0);
     76 
     77       if (n == -1) {
     78         perror("recv");
     79         close(fd);
     80         return 1;
     81       }
     82 
     83       if (n == 0) {
     84         printf("\nserver disconnected\n");
     85         break;
     86       }
     87 
     88       buffer[n] = '\0';
     89 
     90       printf("\r%s", buffer);
     91       printf("> ");
     92       fflush(stdout);
     93     }
     94 
     95     /*
     96      * User typed something.
     97      */
     98     if (fds[1].revents & POLLIN) {
     99       if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
    100         break;
    101       }
    102 
    103       message_size = snprintf(
    104         message,
    105         sizeof(message),
    106         "%s: %s",
    107         nickname,
    108         buffer
    109       );
    110 
    111       if (message_size < 0 || message_size >= (int)sizeof(message)) {
    112         fprintf(stderr, "message too long\n");
    113         continue;
    114       }
    115 
    116       if (send(fd, message, message_size, 0) == -1) {
    117         perror("send");
    118         break;
    119       }
    120 
    121       printf("> ");
    122       fflush(stdout);
    123     }
    124   }
    125 
    126   close(fd);
    127 
    128   return 0;
    129 }