xref: /haiku/src/tests/system/network/tcp_client.c (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
1*5e54f6d4SAugustin Cavalier /*
2*5e54f6d4SAugustin Cavalier  * a stream socket client demo
3*5e54f6d4SAugustin Cavalier  */
4*5e54f6d4SAugustin Cavalier 
5*5e54f6d4SAugustin Cavalier #include <stdio.h>
6*5e54f6d4SAugustin Cavalier #include <stdlib.h>
7*5e54f6d4SAugustin Cavalier #include <unistd.h>
8*5e54f6d4SAugustin Cavalier #include <errno.h>
9*5e54f6d4SAugustin Cavalier #include <string.h>
10*5e54f6d4SAugustin Cavalier #include <netdb.h>
11*5e54f6d4SAugustin Cavalier #include <sys/types.h>
12*5e54f6d4SAugustin Cavalier #include <netinet/in.h>
13*5e54f6d4SAugustin Cavalier #include <sys/socket.h>
14*5e54f6d4SAugustin Cavalier 
15*5e54f6d4SAugustin Cavalier 
16*5e54f6d4SAugustin Cavalier #define PORT 1234		// the port client will be connecting to
17*5e54f6d4SAugustin Cavalier #define MAXDATASIZE 100	// max number of bytes we can get at once
18*5e54f6d4SAugustin Cavalier 
19*5e54f6d4SAugustin Cavalier 
20*5e54f6d4SAugustin Cavalier int
main(int argc,char ** argv)21*5e54f6d4SAugustin Cavalier main(int argc, char **argv)
22*5e54f6d4SAugustin Cavalier {
23*5e54f6d4SAugustin Cavalier 	int sockfd;
24*5e54f6d4SAugustin Cavalier 	char buffer[MAXDATASIZE];
25*5e54f6d4SAugustin Cavalier 	short int port = PORT;
26*5e54f6d4SAugustin Cavalier 	struct hostent *he;
27*5e54f6d4SAugustin Cavalier 	struct sockaddr_in their_addr;
28*5e54f6d4SAugustin Cavalier 		// connector's address information
29*5e54f6d4SAugustin Cavalier 
30*5e54f6d4SAugustin Cavalier 	if (argc < 2) {
31*5e54f6d4SAugustin Cavalier 		fprintf(stderr,"usage: tcp_client <hostname> [port]\n");
32*5e54f6d4SAugustin Cavalier 		exit(1);
33*5e54f6d4SAugustin Cavalier 	}
34*5e54f6d4SAugustin Cavalier 
35*5e54f6d4SAugustin Cavalier 	if (argc == 3)
36*5e54f6d4SAugustin Cavalier 		port = atoi(argv[2]);
37*5e54f6d4SAugustin Cavalier 
38*5e54f6d4SAugustin Cavalier 	if ((he = gethostbyname(argv[1])) == NULL) {
39*5e54f6d4SAugustin Cavalier 		// get the host info
40*5e54f6d4SAugustin Cavalier 		perror("gethostbyname");
41*5e54f6d4SAugustin Cavalier 		exit(1);
42*5e54f6d4SAugustin Cavalier 	}
43*5e54f6d4SAugustin Cavalier 
44*5e54f6d4SAugustin Cavalier 	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
45*5e54f6d4SAugustin Cavalier 		perror("socket");
46*5e54f6d4SAugustin Cavalier 		exit(1);
47*5e54f6d4SAugustin Cavalier 	}
48*5e54f6d4SAugustin Cavalier 
49*5e54f6d4SAugustin Cavalier 	memset(&their_addr, 0, sizeof(their_addr));
50*5e54f6d4SAugustin Cavalier 	their_addr.sin_family = AF_INET;
51*5e54f6d4SAugustin Cavalier 	their_addr.sin_port = htons(port);
52*5e54f6d4SAugustin Cavalier 	their_addr.sin_addr = *((struct in_addr *)he->h_addr);
53*5e54f6d4SAugustin Cavalier 
54*5e54f6d4SAugustin Cavalier 	if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
55*5e54f6d4SAugustin Cavalier 		perror("connect");
56*5e54f6d4SAugustin Cavalier 		exit(1);
57*5e54f6d4SAugustin Cavalier 	}
58*5e54f6d4SAugustin Cavalier 
59*5e54f6d4SAugustin Cavalier 	if (!fork()) {
60*5e54f6d4SAugustin Cavalier 		int numBytes;
61*5e54f6d4SAugustin Cavalier 
62*5e54f6d4SAugustin Cavalier 		while (1) {
63*5e54f6d4SAugustin Cavalier 			// child process
64*5e54f6d4SAugustin Cavalier 			if ((numBytes = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) == -1) {
65*5e54f6d4SAugustin Cavalier 				perror("recv");
66*5e54f6d4SAugustin Cavalier 				sleep(1);
67*5e54f6d4SAugustin Cavalier 				// want the read thread to stay alive
68*5e54f6d4SAugustin Cavalier 				continue;
69*5e54f6d4SAugustin Cavalier 			}
70*5e54f6d4SAugustin Cavalier 
71*5e54f6d4SAugustin Cavalier 			buffer[numBytes] = '\0';
72*5e54f6d4SAugustin Cavalier 			printf("%s", buffer);
73*5e54f6d4SAugustin Cavalier 		}
74*5e54f6d4SAugustin Cavalier 	} else {
75*5e54f6d4SAugustin Cavalier 		while (1) {
76*5e54f6d4SAugustin Cavalier 			// parent process
77*5e54f6d4SAugustin Cavalier 			if (fgets(buffer, sizeof(buffer) - 1, stdin) == NULL) {
78*5e54f6d4SAugustin Cavalier 				perror("fgets");
79*5e54f6d4SAugustin Cavalier 				exit(1);
80*5e54f6d4SAugustin Cavalier 			}
81*5e54f6d4SAugustin Cavalier 
82*5e54f6d4SAugustin Cavalier 			if ((send(sockfd, buffer, strlen(buffer), 0)) == -1) {
83*5e54f6d4SAugustin Cavalier 				perror("send");
84*5e54f6d4SAugustin Cavalier 				exit(1);
85*5e54f6d4SAugustin Cavalier 			}
86*5e54f6d4SAugustin Cavalier 		}
87*5e54f6d4SAugustin Cavalier 	}
88*5e54f6d4SAugustin Cavalier 
89*5e54f6d4SAugustin Cavalier 	close(sockfd);
90*5e54f6d4SAugustin Cavalier 
91*5e54f6d4SAugustin Cavalier 	return 0;
92*5e54f6d4SAugustin Cavalier }
93*5e54f6d4SAugustin Cavalier 
94