1 #include "locktests.h"
2 
3 #include <netdb.h>
4 #include <string.h>
5 #define PORT 12346
6 #define MAX_CONNECTION 16
7 
8 int maxClients;
9 int *fdClient;
10 char *server_name;
11 int fdServer;
12 extern char message[M_SIZE];
13 
serverReceiveClient(int c)14 int serverReceiveClient(int c)
15 {
16 	char tmp[M_SIZE];
17 	int r, s;
18 	/* Ensure we read _exactly_ M_SIZE characters in the message */
19 	memset(message, 0, M_SIZE);
20 	memset(tmp, 0, M_SIZE);
21 	r = 0;
22 	s = 0;
23 
24 	while (s < M_SIZE) {
25 		r = read(fdClient[c], tmp, M_SIZE - s);
26 		/* Loop until we have a complete message */
27 		strncpy(message + s, tmp, r);
28 		s += r;
29 	}
30 	return s;
31 }
32 
serverSendClient(int n)33 int serverSendClient(int n)
34 {
35 	return write(fdClient[n], message, M_SIZE);
36 }
37 
clientReceiveNet(void)38 int clientReceiveNet(void)
39 {
40 	readFromServer(message);
41 	return 0;
42 }
43 
setupConnectionServer(void)44 int setupConnectionServer(void)
45 {
46 	struct sockaddr_in local;
47 	int c;
48 	socklen_t size;
49 	int sock;
50 	struct sockaddr_in remote;
51 
52 	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
53 		perror("socket");
54 		exit(1);
55 	}
56 	memset(&local, 0x00, sizeof(local));
57 	local.sin_family = AF_INET;
58 	local.sin_port = htons(PORT);
59 	local.sin_addr.s_addr = INADDR_ANY;
60 	memset(&(local.sin_zero), 0x00, 8);
61 
62 	if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) ==
63 	    -1) {
64 		perror("bind");
65 		exit(1);
66 	}
67 
68 	if (listen(sock, MAX_CONNECTION) == -1) {
69 		perror("listen");
70 		return 1;
71 	}
72 	size = sizeof(struct sockaddr_in);
73 	for (c = 0; c < maxClients; c++) {
74 		if ((fdClient[c] =
75 		     accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
76 			perror("accept");
77 			return 1;
78 		}
79 
80 	}
81 	return 0;
82 }
83 
writeToClient(int c,char * message)84 int writeToClient(int c, char *message)
85 {
86 	return write(fdClient[c], message, 512);
87 }
88 
serverCloseConnection(void)89 int serverCloseConnection(void)
90 {
91 	int c;
92 	for (c = 0; c < maxClients; c++)
93 		close(fdClient[c]);
94 	return 0;
95 
96 }
97 
writeToAllClients(char * foo)98 int writeToAllClients(char *foo)
99 {
100 	int c;
101 	for (c = 0; c < maxClients; c++)
102 		writeToClient(c, foo);
103 	return 0;
104 }
105 
setupClients(int type,char * fname,int nThread)106 int setupClients(int type, char *fname, int nThread)
107 {
108 	/*
109 	 * Send parameters to all slaves :
110 	 *
111 	 * We must send :
112 	 * - the position of the test file
113 	 * - the number of slaves for each client
114 	 * - The kind of slaves : process or thread
115 	 */
116 	char message[512];
117 	sprintf(message, "%d:%s:%d::", type, fname, nThread);
118 	writeToAllClients(message);
119 	return 0;
120 }
121 
configureServer(int max)122 int configureServer(int max)
123 {
124 	maxClients = max;
125 	fdClient = malloc(sizeof(int) * max);
126 
127 	setupConnectionServer();
128 
129 	return 0;
130 }
131 
setupConnectionClient(void)132 int setupConnectionClient(void)
133 {
134 
135 	struct hostent *server;
136 	struct sockaddr_in serv_addr;
137 
138 	if (!(server = gethostbyname(server_name))) {
139 		printf("erreur DNS\n");
140 		return 1;
141 	}
142 
143 	fdServer = socket(AF_INET, SOCK_STREAM, 0);
144 	if (fdServer < 0) {
145 		perror("socket");
146 		return 1;
147 	}
148 
149 	serv_addr.sin_addr = *(struct in_addr *)server->h_addr;
150 	serv_addr.sin_port = htons(PORT);
151 	serv_addr.sin_family = AF_INET;
152 	if (connect(fdServer, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
153 	    < 0) {
154 		perror("connect");
155 		return 1;
156 	}
157 	return 0;
158 }
159 
readFromServer(char * message)160 int readFromServer(char *message)
161 {
162 	char tmp[M_SIZE];
163 	int r, s;
164 	/* Ensure we read exactly M_SIZE characters */
165 	memset(message, 0, M_SIZE);
166 	memset(tmp, 0, M_SIZE);
167 	r = 0;
168 	s = 0;
169 	while (s < M_SIZE) {
170 		r = read(fdServer, tmp, M_SIZE - s);
171 		/* Loop until we have a complete message */
172 		strncpy(message + s, tmp, r);
173 		s += r;
174 	}
175 	return s;
176 }
177 
getConfiguration(int * type,char * fname,int * nThread)178 int getConfiguration(int *type, char *fname, int *nThread)
179 {
180 	char conf[M_SIZE];
181 	char *p;
182 	int i;
183 	readFromServer(conf);
184 	p = strtok(conf, ":");
185 	printf("%s\n", p);
186 	*type = atoi(p);
187 	p = strtok(NULL, ":");
188 	i = strlen(p);
189 	strncpy(fname, p, i);
190 	p = strtok(NULL, ":");
191 	*nThread = atoi(p);
192 
193 	return 0;
194 }
195 
configureClient(char * s)196 int configureClient(char *s)
197 {
198 	server_name = s;
199 	setupConnectionClient();
200 	return 0;
201 }
202