blob: 98d28aee203618183b7bd18a87590e8e26ac71ff [file] [log] [blame]
rjwalshf5f536f2003-11-17 17:45:00 +00001#include <sys/types.h>
2#include <sys/wait.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <arpa/inet.h>
6#include <stdio.h>
7#include <fcntl.h>
8#include <unistd.h>
9#include <stdlib.h>
10#include <string.h>
11
12void
13server ()
14{
15 int s, x;
16 struct sockaddr_in baddr;
17 struct sockaddr_in addr;
18 int baddrsize = sizeof(baddr);
19 int one = 1;
20
21 s = socket(PF_INET, SOCK_STREAM, 0);
22 if(s == -1) {
23 perror("socket");
24 exit(1);
25 }
26
27 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
28 memset(&addr, 0, sizeof(addr));
29 addr.sin_family = AF_INET;
30 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
31 addr.sin_port = 12321;
32
33 if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
34 perror("bind");
35 exit(1);
36 }
37
38 if(listen(s, 5) == -1) {
39 perror("listen");
40 exit(1);
41 }
42
43 memset(&baddr, 0, sizeof(baddr));
44 x = accept(s, (struct sockaddr *)&baddr, &baddrsize);
45 if(x == -1) {
46 perror("accept");
47 exit(1);
48 }
49
50 write(x, "hello", 6);
51}
52
53void
54client ()
55{
56 int s, count = 0, ret;
57 struct sockaddr_in addr;
58 char buf[1024];
59
60 s = socket(PF_INET, SOCK_STREAM, 0);
61 if(s == -1) {
62 perror("socket");
63 exit(1);
64 }
65
66 addr.sin_family = AF_INET;
67 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
68 addr.sin_port = 12321;
69
70 do {
71 count++;
72 ret = connect(s, (struct sockaddr *)&addr, sizeof(addr));
73 if(ret == -1) sleep(1);
74 } while (count < 10 && ret == -1);
75
76 if(ret == -1) {
77 perror("connect");
78 exit(1);
79 }
80
81 read(s, buf, sizeof(buf));
82
83 printf("%s\n", buf);
84}
85
86
87int
88main (int argc, char **argv)
89{
90 int pid, status;
91
92 /*
93 * Fedora Core 1's Perl opens /dev/pts/2 as fd 10. Let's close it
94 * now to get consistent results across different releases.
95 */
96
97 close(10);
98
99 if((pid = fork()) == 0) {
100 server();
101 return 0;
102 }
103
104 client();
105
106 wait(&status);
107
108 return 0;
109}