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 }