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