blob: 3e449d97428be98faf9e4cb0e93a1482e58f4aaf [file] [log] [blame]
#include "locktests.h"
#include <netdb.h>
#include <string.h>
#define PORT 12346
#define MAX_CONNECTION 16
int maxClients;
int *fdClient;
char *serveur;
int fdServeur;
extern char message[M_SIZE];
int serverReceiveClient(int c) {
char tmp[M_SIZE];
int r,s;
/* Il faut etre sur que l'on lit _exactement_ la trame envoyee (M_SIZE) */
/* Ensure we read _exactly_ M_SIZE characters in the message */
memset(message,0,M_SIZE);
memset(tmp,0,M_SIZE);
r=0;
s=0;
while (s<M_SIZE) {
r=read(fdClient[c],tmp, M_SIZE-s);
/* On complete le message au fur et a mesure */
/* Loop until we have a complete message */
strncpy(message+s,tmp,r);
s+=r;
}
return s;
}
int serverSendClient(int n) {
return write(fdClient[n],message, M_SIZE);
}
int clientReceiveNet() {
readFromServer(message);
return 0;
}
int setupConnectionServeur() {
struct sockaddr_in local;
int c;
socklen_t size;
int sock;
struct sockaddr_in remote;
if ((sock = socket (AF_INET, SOCK_STREAM, 0))<0) {
perror ("socket");
exit(1);
}
memset(&local, 0x00, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = INADDR_ANY;
memset(&(local.sin_zero), 0x00, 8);
if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr))== -1) {
perror("bind");
exit(1);
}
if (listen(sock, MAX_CONNECTION) == -1) {
perror("listen");
return 1;
}
size = sizeof(struct sockaddr_in);
for (c=0;c<maxClients; c++) {
/* On accepte les connections clientes */
/* Accept incoming connections */
if ((fdClient[c]=accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
perror("accept");
return 1;
}
}
return 0;
}
int writeToClient(int c, char *message) {
return write(fdClient[c], message, 512);
}
int serverCloseConnection() {
int c;
for (c=0;c<maxClients;c++)
close(fdClient[c]);
return 0;
}
int writeToAllClients(char *foo) {
int c;
for (c=0;c<maxClients;c++)
writeToClient(c, foo);
return 0;
}
int setupClients(int type, char *fname, int nThread) {
/*
* Envoi des parametres a tous les clients
*
* on doit envoyer 3 parametres :
* - l'emplacement du fichier test
* - Le nombre d'esclaves
* - Le type de sous processus : thread ou process
*/
/*
* Send parameters to all slaves :
*
* We must send :
* - the position of the test file
* - the number of slaves for each client
* - The kind of slaves : process or thread
*/
char message[512];
sprintf(message,"%d:%s:%d::", type,fname,nThread);
writeToAllClients(message);
return 0;
}
int configureServeur(int max) {
maxClients=max;
fdClient=(int *)malloc(sizeof(int)*max);
setupConnectionServeur();
return 0;
}
int setupConnectionClient() {
struct hostent *server;
struct sockaddr_in serv_addr;
if (! (server=gethostbyname(serveur))) {
printf("erreur DNS\n");
return 1;
}
fdServeur = socket (AF_INET, SOCK_STREAM, 0);
if (fdServeur < 0) {
perror ("socket");
return 1;
}
serv_addr.sin_addr = *(struct in_addr*)server->h_addr;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_family = AF_INET;
if (connect(fdServeur, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connect");
return 1;
}
return 0;
}
int readFromServer(char *message) {
char tmp[M_SIZE];
int r,s;
/* Il faut etre sur que l'on lit _exactement_ la trame envoyee de taille M_SIZE */
/* Ensure we read exactly M_SIZE characters */
memset(message,0,M_SIZE);
memset(tmp,0,M_SIZE);
r=0; s=0;
while (s<M_SIZE) {
r=read(fdServeur,tmp, M_SIZE-s);
/* On complete le message au fur et a mesure */
/* Loop until we have a complete message */
strncpy(message+s,tmp,r);
s+=r;
}
return s;
}
int getConfiguration(int *type, char *fname, int *nThread) {
char conf[M_SIZE];
char *p;
int i;
readFromServer(conf);
p=strtok(conf,":");
printf("%s\n",p);
*type=atoi(p);
p=strtok(NULL,":");
i=strlen(p);
strncpy(fname, p,i);
p=strtok(NULL,":");
*nThread=atoi(p);
return 0;
}
int configureClient(char *s) {
serveur=s;
setupConnectionClient();
return 0;
}