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