/* * a stream socket client demo */ #include #include #include #include #include #include #include #include #include #define PORT 1234 // the port client will be connecting to #define MAXDATASIZE 100 // max number of bytes we can get at once int main(int argc, char **argv) { int sockfd; char buffer[MAXDATASIZE]; short int port = PORT; struct hostent *he; struct sockaddr_in their_addr; // connector's address information if (argc < 2) { fprintf(stderr,"usage: tcp_client [port]\n"); exit(1); } if (argc == 3) port = atoi(argv[2]); if ((he = gethostbyname(argv[1])) == NULL) { // get the host info perror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } memset(&their_addr, 0, sizeof(their_addr)); their_addr.sin_family = AF_INET; their_addr.sin_port = htons(port); their_addr.sin_addr = *((struct in_addr *)he->h_addr); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if (!fork()) { int numBytes; while (1) { // child process if ((numBytes = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) == -1) { perror("recv"); sleep(1); // want the read thread to stay alive continue; } buffer[numBytes] = '\0'; printf("%s", buffer); } } else { while (1) { // parent process if (fgets(buffer, sizeof(buffer) - 1, stdin) == NULL) { perror("fgets"); exit(1); } if ((send(sockfd, buffer, strlen(buffer), 0)) == -1) { perror("send"); exit(1); } } } close(sockfd); return 0; }