xref: /haiku/src/tests/system/network/test2.c (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
1*5e54f6d4SAugustin Cavalier #include <stdio.h>
2*5e54f6d4SAugustin Cavalier #include <kernel/OS.h>
3*5e54f6d4SAugustin Cavalier #include <string.h>
4*5e54f6d4SAugustin Cavalier #include <sys/time.h>
5*5e54f6d4SAugustin Cavalier #include <malloc.h>
6*5e54f6d4SAugustin Cavalier 
7*5e54f6d4SAugustin Cavalier #include "sys/socket.h"
8*5e54f6d4SAugustin Cavalier #include "netinet/in.h"
9*5e54f6d4SAugustin Cavalier #include "arpa/inet.h"
10*5e54f6d4SAugustin Cavalier #include "sys/select.h"
11*5e54f6d4SAugustin Cavalier 
12*5e54f6d4SAugustin Cavalier #include "ufunc.h"
13*5e54f6d4SAugustin Cavalier 
14*5e54f6d4SAugustin Cavalier #define THREADS	2
15*5e54f6d4SAugustin Cavalier #define TIME	10
16*5e54f6d4SAugustin Cavalier 
17*5e54f6d4SAugustin Cavalier 
test_thread(void * data)18*5e54f6d4SAugustin Cavalier int32 test_thread(void *data)
19*5e54f6d4SAugustin Cavalier {
20*5e54f6d4SAugustin Cavalier 	int tnum = *(int*)data;
21*5e54f6d4SAugustin Cavalier 	int sock = 0;
22*5e54f6d4SAugustin Cavalier 	uint32 num = 0;
23*5e54f6d4SAugustin Cavalier 	int rv;
24*5e54f6d4SAugustin Cavalier 	struct sockaddr_in sa;
25*5e54f6d4SAugustin Cavalier 	bigtime_t tn;
26*5e54f6d4SAugustin Cavalier 
27*5e54f6d4SAugustin Cavalier 	sa.sin_len = sizeof(sa);
28*5e54f6d4SAugustin Cavalier 	sa.sin_port = 0;
29*5e54f6d4SAugustin Cavalier 	sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
30*5e54f6d4SAugustin Cavalier 	sa.sin_family = AF_INET;
31*5e54f6d4SAugustin Cavalier 	memset(&sa.sin_zero, 0, sizeof(sa.sin_zero));
32*5e54f6d4SAugustin Cavalier 
33*5e54f6d4SAugustin Cavalier 	printf("Thread %d, starting test...\n", tnum + 1);
34*5e54f6d4SAugustin Cavalier 
35*5e54f6d4SAugustin Cavalier 	tn = real_time_clock();
36*5e54f6d4SAugustin Cavalier 
37*5e54f6d4SAugustin Cavalier 	while (real_time_clock() - tn <= TIME) {
38*5e54f6d4SAugustin Cavalier 		sock = socket(AF_INET, SOCK_DGRAM , 0);
39*5e54f6d4SAugustin Cavalier 		if (sock < 0)
40*5e54f6d4SAugustin Cavalier 			err(sock, "Socket couldn't be created");
41*5e54f6d4SAugustin Cavalier 		rv = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
42*5e54f6d4SAugustin Cavalier 		if (rv < 0)
43*5e54f6d4SAugustin Cavalier 			err(rv, "Socket could not be bound to an ephemereal port");
44*5e54f6d4SAugustin Cavalier 		closesocket(sock);
45*5e54f6d4SAugustin Cavalier 		num++;
46*5e54f6d4SAugustin Cavalier 	}
47*5e54f6d4SAugustin Cavalier 
48*5e54f6d4SAugustin Cavalier 	printf( "Thread %d:\n"
49*5e54f6d4SAugustin Cavalier 		"       sockets created : %5ld\n"
50*5e54f6d4SAugustin Cavalier 		"       test time       : %5d seconds\n"
51*5e54f6d4SAugustin Cavalier 		"       average         : %5ld sockets/sec\n",
52*5e54f6d4SAugustin Cavalier 		tnum + 1, num, TIME, num / TIME);
53*5e54f6d4SAugustin Cavalier }
54*5e54f6d4SAugustin Cavalier 
main(int argc,char ** argv)55*5e54f6d4SAugustin Cavalier int main(int argc, char **argv)
56*5e54f6d4SAugustin Cavalier {
57*5e54f6d4SAugustin Cavalier 	thread_id t[THREADS];
58*5e54f6d4SAugustin Cavalier 	int i;
59*5e54f6d4SAugustin Cavalier 	status_t retval;
60*5e54f6d4SAugustin Cavalier 
61*5e54f6d4SAugustin Cavalier 	test_banner("Socket creation and bind() test");
62*5e54f6d4SAugustin Cavalier 
63*5e54f6d4SAugustin Cavalier 	for (i=0;i<THREADS;i++) {
64*5e54f6d4SAugustin Cavalier 		t[i] = spawn_thread(test_thread, "socket test thread",
65*5e54f6d4SAugustin Cavalier 			B_NORMAL_PRIORITY, &i);
66*5e54f6d4SAugustin Cavalier 		if (t[i] >= 0)
67*5e54f6d4SAugustin Cavalier 			resume_thread(t[i]);
68*5e54f6d4SAugustin Cavalier 	}
69*5e54f6d4SAugustin Cavalier 
70*5e54f6d4SAugustin Cavalier 	for (i=0;i<THREADS;i++) {
71*5e54f6d4SAugustin Cavalier 		wait_for_thread(t[i], &retval);
72*5e54f6d4SAugustin Cavalier 	}
73*5e54f6d4SAugustin Cavalier 
74*5e54f6d4SAugustin Cavalier 	return (0);
75*5e54f6d4SAugustin Cavalier }
76*5e54f6d4SAugustin Cavalier 
77*5e54f6d4SAugustin Cavalier 
78