• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *serveur;
11 int fdServeur;
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 	/* Il faut etre sur que l'on lit _exactement_ la trame envoyee (M_SIZE) */
19 	/* Ensure we read _exactly_ M_SIZE characters in the message */
20 	memset(message, 0, M_SIZE);
21 	memset(tmp, 0, M_SIZE);
22 	r = 0;
23 	s = 0;
24 
25 	while (s < M_SIZE) {
26 		r = read(fdClient[c], tmp, M_SIZE - s);
27 		/* On complete le message au fur et a mesure */
28 		/* Loop until we have a complete  message */
29 		strncpy(message + s, tmp, r);
30 		s += r;
31 	}
32 	return s;
33 }
34 
serverSendClient(int n)35 int serverSendClient(int n)
36 {
37 	return write(fdClient[n], message, M_SIZE);
38 }
39 
clientReceiveNet()40 int clientReceiveNet()
41 {
42 	readFromServer(message);
43 	return 0;
44 }
45 
setupConnectionServeur()46 int setupConnectionServeur()
47 {
48 	struct sockaddr_in local;
49 	int c;
50 	socklen_t size;
51 	int sock;
52 	struct sockaddr_in remote;
53 
54 	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
55 		perror("socket");
56 		exit(1);
57 	}
58 	memset(&local, 0x00, sizeof(local));
59 	local.sin_family = AF_INET;
60 	local.sin_port = htons(PORT);
61 	local.sin_addr.s_addr = INADDR_ANY;
62 	memset(&(local.sin_zero), 0x00, 8);
63 
64 	if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) ==
65 	    -1) {
66 		perror("bind");
67 		exit(1);
68 	}
69 
70 	if (listen(sock, MAX_CONNECTION) == -1) {
71 		perror("listen");
72 		return 1;
73 	}
74 	size = sizeof(struct sockaddr_in);
75 	for (c = 0; c < maxClients; c++) {
76 
77 		/* On accepte les connections clientes */
78 		/* Accept incoming connections */
79 		if ((fdClient[c] =
80 		     accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
81 			perror("accept");
82 			return 1;
83 		}
84 
85 	}
86 	return 0;
87 }
88 
writeToClient(int c,char * message)89 int writeToClient(int c, char *message)
90 {
91 	return write(fdClient[c], message, 512);
92 }
93 
serverCloseConnection()94 int serverCloseConnection()
95 {
96 	int c;
97 	for (c = 0; c < maxClients; c++)
98 		close(fdClient[c]);
99 	return 0;
100 
101 }
102 
writeToAllClients(char * foo)103 int writeToAllClients(char *foo)
104 {
105 	int c;
106 	for (c = 0; c < maxClients; c++)
107 		writeToClient(c, foo);
108 	return 0;
109 }
110 
setupClients(int type,char * fname,int nThread)111 int setupClients(int type, char *fname, int nThread)
112 {
113 	/*
114 	 * Envoi des parametres a tous les clients
115 	 *
116 	 * on doit envoyer 3 parametres :
117 	 * - l'emplacement du fichier test
118 	 * - Le nombre d'esclaves
119 	 * - Le type de sous processus : thread ou process
120 	 */
121 
122 	/*
123 	 * Send parameters to all slaves :
124 	 *
125 	 * We must send :
126 	 * - the position of the test file
127 	 * - the number of slaves for each client
128 	 * - The kind of slaves : process or thread
129 	 */
130 
131 	char message[512];
132 	sprintf(message, "%d:%s:%d::", type, fname, nThread);
133 	writeToAllClients(message);
134 	return 0;
135 }
136 
configureServeur(int max)137 int configureServeur(int max)
138 {
139 	maxClients = max;
140 	fdClient = malloc(sizeof(int) * max);
141 
142 	setupConnectionServeur();
143 
144 	return 0;
145 }
146 
setupConnectionClient()147 int setupConnectionClient()
148 {
149 
150 	struct hostent *server;
151 	struct sockaddr_in serv_addr;
152 
153 	if (!(server = gethostbyname(serveur))) {
154 		printf("erreur DNS\n");
155 		return 1;
156 	}
157 
158 	fdServeur = socket(AF_INET, SOCK_STREAM, 0);
159 	if (fdServeur < 0) {
160 		perror("socket");
161 		return 1;
162 	}
163 
164 	serv_addr.sin_addr = *(struct in_addr *)server->h_addr;
165 	serv_addr.sin_port = htons(PORT);
166 	serv_addr.sin_family = AF_INET;
167 	if (connect(fdServeur, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
168 	    < 0) {
169 		perror("connect");
170 		return 1;
171 	}
172 	return 0;
173 }
174 
readFromServer(char * message)175 int readFromServer(char *message)
176 {
177 	char tmp[M_SIZE];
178 	int r, s;
179 	/* Il faut etre sur que l'on lit _exactement_ la trame envoyee de taille M_SIZE */
180 	/* Ensure we read exactly M_SIZE characters */
181 	memset(message, 0, M_SIZE);
182 	memset(tmp, 0, M_SIZE);
183 	r = 0;
184 	s = 0;
185 	while (s < M_SIZE) {
186 		r = read(fdServeur, tmp, M_SIZE - s);
187 		/* On complete le message au fur et a mesure */
188 		/* Loop until we have a complete message */
189 		strncpy(message + s, tmp, r);
190 		s += r;
191 	}
192 	return s;
193 }
194 
getConfiguration(int * type,char * fname,int * nThread)195 int getConfiguration(int *type, char *fname, int *nThread)
196 {
197 	char conf[M_SIZE];
198 	char *p;
199 	int i;
200 	readFromServer(conf);
201 	p = strtok(conf, ":");
202 	printf("%s\n", p);
203 	*type = atoi(p);
204 	p = strtok(NULL, ":");
205 	i = strlen(p);
206 	strncpy(fname, p, i);
207 	p = strtok(NULL, ":");
208 	*nThread = atoi(p);
209 
210 	return 0;
211 }
212 
configureClient(char * s)213 int configureClient(char *s)
214 {
215 	serveur = s;
216 	setupConnectionClient();
217 	return 0;
218 }
219