diff --git a/main b/main index 3d49cfb..cbbd88e 100755 Binary files a/main and b/main differ diff --git a/main.c b/main.c index d709918..b0beaaa 100644 --- a/main.c +++ b/main.c @@ -3,6 +3,17 @@ #include #include "server.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + int checkIpPortValid(int, char **); int valid_digit(char *); int checkIp(char *); @@ -20,12 +31,27 @@ int main(int argc, char *argv[]) { while(1) { // The code will run until the "exit" command is summoned char buffer[100]; // Show the user interface - printf("Available commands:\n\n new i - create a new ring with the i server only \n exit\n"); + printf("Available commands:\n\n new i \n sentry i succi succi.IP succi.TCP \n exit\n"); fgets(buffer, 100 , stdin); const char delim[2] = " "; if(strcmp(strtok(strdup(buffer), delim), "new") == 0) { // Check if the command is the new command sscanf(buffer, "%s %d", aux, &(myServer->key)); // Get the server key createServer(myServer); + } else if(strcmp(strtok(strdup(buffer), delim), "sentry") == 0) { // Check if the command is the sentry command + sscanf(buffer, "%s %d %d %s %s", aux, &(myServer->key), &(myServer->nextKey), myServer->nextIp, myServer->nextPort); // Get the successor details + myServer->nextConnFD = connectToGivenServer(myServer); // Set the next server as the given server and establish a connection + + int n = write(myServer->nextConnFD, "SUCCCONF\n", 10); // Tell the successor to define this server as its predecessor + if(n == -1)/*error*/exit(1); + + n = read(myServer->nextConnFD, buffer, 128); // We already have all the data from the next server so we don't need to extract it here in the sentry + if(n==-1)/*error*/exit(1); + + write(1,"echo: ",6); write(1,buffer,n); + + // freeaddrinfo(res); + close(myServer->nextConnFD); + } else if(strcmp(buffer, "exit\n") == 0) { exit(0); } diff --git a/server.c b/server.c index e2d4204..3be9c0a 100644 --- a/server.c +++ b/server.c @@ -112,8 +112,22 @@ void createServer(Server* server) { } else { buffer[n] = '\0'; write(1,"received: ",11); write(1,buffer,n); // Print incoming message - n = write(newfd,"Server Response\n",17); - if(n==-1)/*error*/exit(1); + if(strcmp(buffer, "SUCCCONF\n") == 0) { // If this server is set as a successor + if(server->prevConnFD == 0) { // If the previous server is not set + server->prevConnFD = newfd; // Set the incoming request as the previous server + sprintf(buffer, "SUCC %d %s %s\n", server->key, server->myIp, server->myPort); + n = write(server->prevConnFD,buffer, strlen(buffer)); // Server gives its predecessor his info + if(n==-1)/*error*/exit(1); + } else { // If it already has a predecessor + + // This two operations that follow should only be done after the NEW command, which is where we no longer need to connect to the old predecessor + // // close(server->prevConnFD); // Close connection with predecessor + // // server->prevConnFD = newfd; // Set the incoming request as the previous server + + } + } + // n = write(newfd,"Server Response\n",17); + // if(n==-1)/*error*/exit(1); } } } @@ -121,3 +135,26 @@ void createServer(Server* server) { freeaddrinfo(res); close(fd); } + +int connectToGivenServer(Server* server) { // sentry 5 10 127.0.0.1 8005 + fd = socket(AF_INET,SOCK_STREAM,0); //TCP socket + if (fd == -1) exit(1); //error + + memset(&hints,0,sizeof hints); + hints.ai_family=AF_INET; //IPv4 + hints.ai_socktype=SOCK_STREAM; //TCP socket + + errcode = getaddrinfo(server->nextIp, server->nextPort,&hints,&res); + if(errcode != 0) { + printf("GET ADDRESS INFO ERROR\n"); + exit(1); + } + + n = connect(fd,res->ai_addr,res->ai_addrlen); + if(n == -1) { + printf("CONNECT ERROR\n"); + exit(1); + } + + return fd; +} diff --git a/server.h b/server.h index d3f0d26..89c200a 100644 --- a/server.h +++ b/server.h @@ -6,13 +6,21 @@ typedef struct server { char myPort[10]; int key; - char* nextIp; - char* previousIp; - char* doubleNextIp; + char nextIp[30]; + char nextPort[10]; + int nextKey; + + char doubleNextIp[30]; + char doubleNextPort[10]; + int doubleNextKey; + + int prevConnFD; // Holds the TCP connection to previous server + int nextConnFD; // Holds the TCP connection to next server }Server; void createServer(Server*); +int connectToGivenServer(Server*); #endif \ No newline at end of file diff --git a/test/tester b/test/tester index 7d9b370..57c0a3d 100755 Binary files a/test/tester and b/test/tester differ diff --git a/test/tester.c b/test/tester.c index 1f76489..189e094 100644 --- a/test/tester.c +++ b/test/tester.c @@ -37,7 +37,7 @@ void main(int argc, char *argv[]) { n=connect(fd,res->ai_addr,res->ai_addrlen); if(n==-1)/*error*/exit(1); - // while(1) { + while(1) { char user_input[128]; fgets(user_input, 100 , stdin); n=write(fd,user_input, strlen(user_input)); @@ -47,7 +47,7 @@ void main(int argc, char *argv[]) { if(n==-1)/*error*/exit(1); write(1,"Teste: ",8); write(1,buffer,n); write(1, "\n", 3); - // } + } freeaddrinfo(res); close(fd);