#include /* basic system data types */ #include /* basic socket definitions */ #include #include #include #include #include #include #define MAXLINE 1024 ssize_t readline(int fd, void *vptr, size_t maxlen) { int n, rc; char c, *ptr; ptr = vptr; for (n = 1; n < maxlen; n++) { if ( (rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if (c == '\n') break; /* newline is stored, like fgets() */ } else if (rc == 0) { if (n == 1) return(0); /* EOF, no data read */ else break; /* EOF, some data was read */ } else return(-1); /* error, errno set by read() */ } *ptr = 0; /* null terminate like fgets() */ return(n); } /* end readline */ void str_cli(FILE *fp, int sockfd) { char sendline[MAXLINE], recvline[MAXLINE]; while (fgets(sendline, MAXLINE, fp) != NULL) { write(sockfd, sendline, strlen(sendline)); if (readline(sockfd, recvline, MAXLINE) == 0) { printf("str_cli: server terminated prematurely\n"); exit(-1); } fputs(recvline, stdout); } } int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; int retval; if (argc != 2) { printf("usage: tcpcli \n"); exit(-1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() failed.\n"); exit(-1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6789); // inet_pton(AF_INET, argv[1], &servaddr.sin_addr); servaddr.sin_addr.s_addr = inet_addr(argv[1]); retval = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); if (retval == -1) { printf("connect() failed.\n"); exit(-1); } str_cli(stdin, sockfd); /* do it all */ exit(0); }