1 
2 /*#ifdef __sun*/
3 /* XXX */
4 #if 1
5 
6 int
main()7 main() {
8 	puts("-lnsl!");
9 	puts("-lsocket!!");
10 	puts("-lresolv!!!");
11 	puts("-lol!!!!!!!!!!!!!!!!!!!!!!!!!!!");
12 }
13 
14 #else
15 
16 #include <sys/types.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19 #include <arpa/inet.h>
20 #include <netdb.h>
21 #include <unistd.h>
22 #include <signal.h>
23 
24 static void
client()25 client() {
26 	struct sockaddr_in	sa;
27 	char			buf[1024];
28 	int			tries = 0;
29 	int			s;
30 	int			rc;
31 	int			bytes_read = 0;
32 
33 	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
34 		perror("socket");
35 		return;
36 	}
37 	sa.sin_family = AF_INET;
38 	sa.sin_port = htons(9991);
39 	sa.sin_addr.s_addr = inet_addr("127.0.0.1");
40 
41 	do {
42 		if (connect(s, (struct sockaddr *)&sa, sizeof sa) == -1) {
43 			sched_yield();
44 		} else {
45 			break;
46 		}
47 	} while (++tries < 10);
48 
49 	while ((rc = recv(s, buf, sizeof buf, 0)) > 0) {
50 		bytes_read += rc;
51 	}
52 	printf("%d\n", bytes_read);
53 }
54 
55 static void
server()56 server() {
57 	int			s, s2;
58 	struct sockaddr_in	sa;
59 	int			salen;
60 	int			i;
61 	char			buf[1024];
62 
63 	memset(buf, 'x', sizeof buf);
64 	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
65 		perror("socket");
66 		return;
67 	}
68 
69 	sa.sin_addr.s_addr = INADDR_ANY;
70 	sa.sin_family = AF_INET;
71 	sa.sin_port = htons(9991);
72 	salen = 1;
73 	(void) setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &salen, sizeof(int));
74 	salen = sizeof sa;
75 	if (bind(s, (struct sockaddr *)&sa, salen) == -1) {
76 		perror("bind");
77 		return;
78 	}
79 	if (listen(s, 1) == -1) {
80 		perror("listen");
81 		return;
82 	}
83 	s2 = accept(s, (struct sockaddr *)&sa, &salen);
84 	if (s2 == -1) {
85 		perror("accept");
86 		return;
87 	}
88 
89 	(void) signal(SIGPIPE, SIG_IGN);
90 	for (i = 0; i < 128; ++i) {
91 		(void) send(s2, buf, sizeof buf, 0);
92 	}
93 }
94 
95 int
main()96 main() {
97 	struct sockaddr_in	sa;
98 
99 
100 	switch (fork()) {
101 	case -1:
102 		perror("fork");
103 		break;
104 	case 0:
105 		server();
106 		_exit(0);
107 		break;
108 	default:
109 		client();
110 		(void) wait(NULL);
111 	}
112 }
113 
114 #endif
115 
116