You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
3.5 KiB
202 lines
3.5 KiB
#include "locktests.h"
|
|
|
|
#include <netdb.h>
|
|
#include <string.h>
|
|
#define PORT 12346
|
|
#define MAX_CONNECTION 16
|
|
|
|
int maxClients;
|
|
int *fdClient;
|
|
char *server_name;
|
|
int fdServer;
|
|
extern char message[M_SIZE];
|
|
|
|
int serverReceiveClient(int c)
|
|
{
|
|
char tmp[M_SIZE];
|
|
int r, s;
|
|
/* 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);
|
|
/* 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(void)
|
|
{
|
|
readFromServer(message);
|
|
return 0;
|
|
}
|
|
|
|
int setupConnectionServer(void)
|
|
{
|
|
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++) {
|
|
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(void)
|
|
{
|
|
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)
|
|
{
|
|
/*
|
|
* 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 configureServer(int max)
|
|
{
|
|
maxClients = max;
|
|
fdClient = malloc(sizeof(int) * max);
|
|
|
|
setupConnectionServer();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int setupConnectionClient(void)
|
|
{
|
|
|
|
struct hostent *server;
|
|
struct sockaddr_in serv_addr;
|
|
|
|
if (!(server = gethostbyname(server_name))) {
|
|
printf("erreur DNS\n");
|
|
return 1;
|
|
}
|
|
|
|
fdServer = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (fdServer < 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(fdServer, (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;
|
|
/* 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(fdServer, tmp, M_SIZE - s);
|
|
/* 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)
|
|
{
|
|
server_name = s;
|
|
setupConnectionClient();
|
|
return 0;
|
|
}
|