From b469160318ceb73bdc70266019afcd07f6e7b930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Maria=20Janeiro?= Date: Wed, 15 Apr 2020 12:38:21 +0100 Subject: [PATCH] Changes. Makefile --- Makefile | 13 +++++++++++ dkt | Bin 0 -> 28312 bytes main | Bin 28392 -> 28312 bytes main.c | 6 +++-- server.c | 67 ++++++++++++++++++++++++++++--------------------------- 5 files changed, 51 insertions(+), 35 deletions(-) create mode 100644 Makefile create mode 100755 dkt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d5ec4bd --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +#compiler used +CC = gcc + +CFLAGS = -Wall + +#executable name +EXECUTABLE = dkt + +$(EXECUTABLE): + $(CC) $(CFLAGS) *.c -o $(EXECUTABLE) + +clean: + rm $(EXECUTABLE) diff --git a/dkt b/dkt new file mode 100755 index 0000000000000000000000000000000000000000..0ec67e837100488e03fb5c2d71c0b08c3c5d1b75 GIT binary patch literal 28312 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 rvrQjE!W}ZFELA5WQjxy|H4$4K;xhF^iUT@RP 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 literal 28392 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, "127.0.0.1"); + strcpy(myServer->myIp, ip); strcpy(myServer->myPort, argv[2]); @@ -177,7 +179,7 @@ int checkIp(char * ip) { if (ptr != NULL) ++dots; } else { - printf("Strange Format my boy"); + printf("Did you enter a number in the ip?\n"); return 0; } } diff --git a/server.c b/server.c index 15d6977..b79f250 100644 --- a/server.c +++ b/server.c @@ -141,7 +141,8 @@ void createServer(Server* server, int _onGoingOperation) { } serverInRing = 0; cleanServer(server); - for(int i = 0; i < 3; i++) { + int i = 0; + for(i = 0; i < 3; i++) { client_sockets[i] = 0; } } else if(strstr(buffer, "find") != NULL) { @@ -204,14 +205,12 @@ void createServer(Server* server, int _onGoingOperation) { tv.tv_usec = 100000; // 100 ms timeout setsockopt(udp->fd, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)); - sprintf(buffer, "EFND %d\n", server->myKey); do { // If the answer from the server isn't received, send the request again n=sendto(udp->fd,buffer,strlen(buffer),0, udp->res->ai_addr, udp->res->ai_addrlen); if(n==-1) /*error*/ exit(1); } while ((n = recvfrom(udp->fd,buffer,128,0, (struct sockaddr*)&(udp->res->ai_addr),&(udp->res->ai_addrlen))) < 0); - sscanf(buffer, "%s %d %d %s %s", str, &(server->myKey), &(server->nextKey), server->nextIp, server->nextPort); // Get the successor details if(server->myKey == server->nextKey) { printf("Duplicate keys are not allowed, please try to enter with another key!\n"); @@ -234,10 +233,7 @@ void createServer(Server* server, int _onGoingOperation) { // If something is happening in the main socket, it means there's a new connection if(FD_ISSET(fd, &rfds)) { addrlen = sizeof(addr); - if((newfd = accept(fd, (struct sockaddr*)&addr, &addrlen)) == -1) exit(1); - //inform user of socket number - used in send and receive commands - printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , newfd , inet_ntoa(addr.sin_addr) , ntohs (addr.sin_port)); - + if((newfd = accept(fd, (struct sockaddr*)&addr, &addrlen)) == -1) exit(1); client_sockets[0] = newfd; } @@ -258,34 +254,38 @@ void createServer(Server* server, int _onGoingOperation) { //Else its on some other socket - for(int i = 0; i < 3; i++) { + int i = 0; + for(i = 0; i < 3; i++) { newfd = client_sockets[i]; if(FD_ISSET(newfd, &rfds)) { strcpy(buffer, ""); if((n = tpcRead(newfd, buffer)) == 0) { - if((server->myKey == server->doubleNextKey) && (newfd == server->nextConnFD)) { //If there are only 2 servers in the ring... - close(server->nextConnFD); - server->nextConnFD = -1; - int auxKey = server->myKey; - cleanServer(server); - server->myKey = auxKey; - } else if(newfd == server->nextConnFD) { - close(server->nextConnFD); - copyDoubleToNext(server); - server->nextConnFD = connectToNextServer(server); - - sprintf(str, "SUCC %d %s %s\n", server->nextKey, server->nextIp, server->nextPort); - tcpWrite(server->prevConnFD, str); - - tcpWrite(server->nextConnFD, "SUCCCONF\n"); - } else if(newfd == server->prevConnFD) { - close(server->prevConnFD); - server->prevConnFD = -1; + if(i == 0) { // If it's just a connection from FIND, just close it + close(newfd); + } else { + if((server->myKey == server->doubleNextKey) && (newfd == server->nextConnFD)) { //If there are only 2 servers in the ring... + close(server->nextConnFD); + server->nextConnFD = -1; + int auxKey = server->myKey; + cleanServer(server); + server->myKey = auxKey; + } else if(newfd == server->nextConnFD) { + close(server->nextConnFD); + copyDoubleToNext(server); + server->nextConnFD = connectToNextServer(server); + + sprintf(str, "SUCC %d %s %s\n", server->nextKey, server->nextIp, server->nextPort); + tcpWrite(server->prevConnFD, str); + + tcpWrite(server->nextConnFD, "SUCCCONF\n"); + } else if(newfd == server->prevConnFD) { + close(server->prevConnFD); + server->prevConnFD = -1; + } } client_sockets[i] = 0; } else { buffer[strlen(buffer)] = '\0'; - write(1, "Received: ", 11); write(1, buffer, sizeof(buffer)); //Now check what the incoming message is asking for if(strstr(buffer, "NEW") != NULL) { if(newfd == server->nextConnFD) { // If the connection is comming from the next server @@ -339,23 +339,25 @@ void createServer(Server* server, int _onGoingOperation) { } else { //I am the nearest server searchFd = connectToGivenServer(ip, port); sprintf(str, "KEY %d %d %s %s\n", searchKey, server->nextKey, server->nextIp, server->nextPort); + tcpWrite(searchFd, str); + close(searchFd); } } else if(strstr(buffer, "KEY ") != NULL) { int connectKey; char connectIp[30], connectPort[10]; sscanf(buffer, "%s %d %d %s %s", str, &searchKey, &connectKey, connectIp, connectPort); - printf("Linha 330 recebido: %s\n", buffer); + printf("The key was found at %d\n", connectKey); + sprintf(buffer, "EKEY %d %d %s %s\n", searchKey, connectKey, connectIp, connectPort); - n = sendto(udpFd,buffer,strlen(buffer),0, (struct sockaddr*)&udpAddr, udpAddrlen); + n = sendto(udpFd,buffer,strlen(buffer),0, (struct sockaddr*)&udpAddr, udpAddrlen); // Sendto doesn't give an error if updFd is not set ongoingOperation = 0; } } } } - printServerData(server); } // Close newfd close(client_sockets[0]); @@ -468,7 +470,6 @@ void startKeySearch(Server * server, int searchKey, int entry, struct sockaddr* if((server->nextConnFD <= 0) && (server->prevConnFD <= 0)) { //If only 1 server in the ring printf("I'm the nearest server (my key: %d) to %d key\n", server->myKey, searchKey); if(entry == 1) { - printf("Linha 456: %s\n", buffer); sprintf(buffer, "EKEY %d %d %s %s\n", searchKey, server->myKey, server->myIp, server->myPort); n = sendto(fd,buffer,strlen(buffer),0, udpAddr, udpAddrlen); } @@ -481,10 +482,10 @@ void startKeySearch(Server * server, int searchKey, int entry, struct sockaddr* } else { //I am the nearest server printf("Server %d is the nearest server of %d\n", server->nextKey, searchKey); if(entry == 1) { - printf("Linha 469: %s\n", buffer); sprintf(buffer, "EKEY %d %d %s %s\n", searchKey, server->nextKey, server->nextIp, server->nextPort); n = sendto(fd,buffer,strlen(buffer),0, udpAddr, udpAddrlen); } + *_onGoingOperation = 0; } } @@ -510,7 +511,7 @@ void tcpWrite(int toWriteFd, char * strToWrite) { while (nleft>0) { nwritten = write(toWriteFd, strToWrite, nleft); if(nwritten <= 0) { - printf("\n\n MASSIVE ERROR \n\n"); + printf("Write Error\n"); break; } nleft-=nwritten;