diff --git a/myclient.c b/myclient.c index 417aa13..a8294a2 100755 --- a/myclient.c +++ b/myclient.c @@ -95,7 +95,6 @@ int main (int argc, char **argv) { printf("\x1B[37m"); fgets (buffer, BUF, stdin); strcpy(bufferString, buffer); - printf("%s", bufferString); send(create_socket, buffer, strlen (buffer), 0); } while (strcmp (buffer, "quit\n") != 0); diff --git a/myserver.c b/myserver.c index 615cd67..b5535e0 100755 --- a/myserver.c +++ b/myserver.c @@ -10,96 +10,387 @@ #define BUF 1024 #define PORT 6543 -int main (int argc, char **argv) { - char* verzeichnis = argv[1]; - char* meinport = argv[2]; - printf("Mein server Verzeichniss: %s\n", verzeichnis); - printf("Mein server Port: %s\n", meinport); - int create_socket, new_socket; - socklen_t addrlen; - char buffer[BUF]; - int size; - struct sockaddr_in address, cliaddress; +struct msgNumber +{ + int index; +}; - create_socket = socket (AF_INET, SOCK_STREAM, 0); +int writeUsersMessages(char username[1024], struct msgNumber *msgNumbers) +{ + FILE *filePointer; + strcat(username, ".bin"); + filePointer = fopen(username, "wb"); + /**/ + if (!filePointer) + { + printf("\x1B[31mUser Message Speicher konnte nicht geschrieben werden!\x1B[37m\n"); + return 0; + } + for (int i = 0; i < sizeof(msgNumbers) / sizeof(struct msgNumber); i++) + { + printf("MSG NUMMBER IN writeUserMessages(): %d\n", msgNumbers[i].index); + fread(&msgNumbers[i], sizeof(struct msgNumber), 1, filePointer); + } + fclose(filePointer); + return 1; +} - memset(&address,0,sizeof(address)); - address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = htons (*meinport); +int *getUserMessages(char username[1024]) +{ + FILE *filePointer; + strcat(username, ".bin"); + filePointer = fopen(username, "wb"); + printf("start getUserMessages()\n"); + if (!filePointer) + { + printf("\x1B[31User Message Speicher konnte nicht gelesen werden!\x1B[37m\n"); + return 0; + } + int i = 0; + struct msgNumber msgNumbers; + int *msgNumberArr; + printf("Vorm while\n"); + //while(!feof(filePointer)) + while (fread(&msgNumbers, sizeof(struct msgNumber), 1, filePointer)) + { + printf("Im while\n"); + //fread(&msgNumbers[i], sizeof(struct msgNumber),1, filePointer); + printf("Nach dem fread()"); + msgNumberArr[i] = msgNumbers.index; + printf("MSG NUMMBER IN getUserMessages(): %d\n", msgNumberArr[i]); + i += 1; + } + printf("Nach dem while\n"); + fclose(filePointer); + return msgNumberArr; +} - if (bind ( create_socket, (struct sockaddr *) &address, sizeof (address)) != 0) { - perror("bind error"); - return EXIT_FAILURE; - } - listen (create_socket, 5); - - addrlen = sizeof (struct sockaddr_in); +int addUserMessage(char username[1024], int msgNumber) +{ + printf("Vor getUserMessages() in addUserMessage(), username: %s, msgNumber: %d\n", username, msgNumber); + int *msgNumbers = getUserMessages(username); + printf("Nach getUserMessages()\n"); + int result; + if (!msgNumbers) + { + printf("Es wurden keine vorherigen Messages des Users gefunden!\n"); + struct msgNumber newMsgNumber; + newMsgNumber.index = msgNumber; - while (1) { - printf("Waiting for connections...\n"); - new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen ); - if (new_socket > 0) - { - printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port)); - strcpy(buffer,"Welcome to myserver, Please enter your command:\n"); - send(new_socket, buffer, strlen(buffer),0); - } + struct msgNumber msgNumberStruct[1024] = {newMsgNumber}; + result = writeUsersMessages(username, msgNumberStruct); + } + else + { + printf("Es wurden vorherige Messages des Users gefunden, füge neue Message an alte Messages an!\n"); + struct msgNumber newMsgNumber; + newMsgNumber.index = msgNumber; + + struct msgNumber *msgNumberStruct; + msgNumberStruct[0] = newMsgNumber; + for (int i = 1; i < sizeof(msgNumbers) / sizeof(struct msgNumber); i++) + { + struct msgNumber j; + j.index = msgNumbers[i - 1]; + msgNumberStruct[i] = j; + } + + result = writeUsersMessages(username, msgNumberStruct); + } + if (result == 0) + { + printf("\x1B[31mMessage konnte wegen eines fehlers, in writeUserMessages(), nicht gespeichert werden!\x1B[37m\n"); + return 0; + } + else + { + return 1; + } +} + +int writeMessageNumber(int number) +{ + FILE *filePointer; + filePointer = fopen("msgNumber.bin", "wb"); + struct msgNumber my_record; + my_record.index = number; + printf("MSG NUMMBER IN writeMessageNumber(): %d\n", number); + if (!filePointer) + { + printf("\x1B[31mMessage Nummer Speicher konnte nicht geschrieben werden!\x1B[37m\n"); + return 0; + } + fwrite(&my_record, sizeof(struct msgNumber), 1, filePointer); + fclose(filePointer); + printf("MSG NUMMBER IN writeMessageNumber() ist FERTIG!\n"); + return 1; +} + +int readLastMessageNumber() +{ + FILE *filePointer; + filePointer = fopen("msgNumber.bin", "rb"); + struct msgNumber my_record; + if (!filePointer) + { + printf("\x1B[31mMessage Nummer Speicher wurde nicht gefunden!\n\x1B[32mNeuer Nummer Speicher wird angelegt!\x1B[37m\n"); + int result = writeMessageNumber(1); + if (result == 0) + { + return 0; + } + else + { + return 1; + } + } + fread(&my_record, sizeof(struct msgNumber), 1, filePointer); + fclose(filePointer); + printf("MSG NUMMBER IN readLastMessageNumber(): %d\n", my_record.index); + return my_record.index; +} + +int getNextMessageNumber() +{ + int msgNumber = readLastMessageNumber(); + printf("MSG NUMMBER IN getNextMessageNumber() lastmsgNumber: %d\n", msgNumber); + if (msgNumber == 0) + { + printf("\x1B[31mMessage Nummer kam nicht von readLastMessageNumber()!\x1B[37m\n"); + return 0; + } + else + { + int result = writeMessageNumber(msgNumber + 1); + printf("After write MEssage nummber, result: %d\n", result); + if (result == 0) + { + printf("\x1B[31mMessage Nummer konnte nicht gespeichert werden!\x1B[37m\n"); + return 0; + } + else + { + printf("MSG NUMMBER IN getNextMessageNumber() FERTIG!\n"); + return msgNumber + 1; + } + } +} +struct rec +{ + char *sender, *receiver, *betreff, *msg; +}; + +struct rec readFile(char filename[1024]) +{ + FILE *filePointer; + char fullfilename[1024]; + strcat(fullfilename, filename); + strcat(fullfilename, ".bin"); + filePointer = fopen(fullfilename, "rb"); + struct rec my_record; + if (!filePointer) + { + printf("\x1B[31mFile konnte nicht gelesen werden!\x1B[37m\n"); + my_record.sender = "0"; + my_record.receiver = "0"; + my_record.betreff = "0"; + my_record.msg = "0"; + return my_record; + } + fread(&my_record, sizeof(struct msgNumber), 1, filePointer); + fclose(filePointer); + return my_record; +} + +int writeToFile(char sender[1024], char betreff[1024], char receiver[1024], char message[1024]) +{ + FILE *filePointer; + char filename[1024]; + int msgNumber = getNextMessageNumber(); + if (msgNumber == 0) + { + printf("\x1B[31mWrite File konnte nicht geöffnet werden!\x1B[37m\n"); + return 0; + } + else + { + printf("MSG NUMMBER found, schreibe file mit msgNummber: %d!\n", msgNumber); + sprintf(filename, "%d", msgNumber); + strcat(filename, ".bin"); + filePointer = fopen(filename, "wb"); + struct rec my_record; + if (!filePointer) + { + printf("\x1B[31mWrite File konnte nicht geöffnet werden!\x1B[37m\n"); + return 0; + } + else + { + my_record.sender = sender; + my_record.receiver = receiver; + my_record.betreff = betreff; + my_record.msg = message; + printf("Vor useradd() in writeToFile()! sender: %s, msgnumber: %d, msg: %s, betrf: %s, empf: %s\n", sender, msgNumber, message, betreff, receiver); + int userresult = addUserMessage(sender, msgNumber); + printf("Nach useradd() in writeToFile(): %d", userresult); + if (userresult == 0) + { + printf("\x1B[31mKonnte die Nachricht dem User nicht hinzufügen! Das Speichern der Nachricht wird abgebrochen!\x1B[37m\n"); + return 0; + } + else + { + fwrite(&my_record, sizeof(struct rec), 1, filePointer); + fclose(filePointer); + printf("MSG NUMMBER IN writeToFile(): %d\n", msgNumber); + return 1; + } + } + } +} + +int main(int argc, char **argv) +{ + char *verzeichnis = argv[1]; + char *meinport = argv[2]; + printf("\x1B[35mMein server Verzeichniss: %s\n", verzeichnis); + printf("Mein server Port: %s\n", meinport); + int create_socket, new_socket; + socklen_t addrlen; + char buffer[BUF]; + int size; + struct sockaddr_in address, cliaddress; + + create_socket = socket(AF_INET, SOCK_STREAM, 0); + + memset(&address, 0, sizeof(address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons(*meinport); + + if (bind(create_socket, (struct sockaddr *)&address, sizeof(address)) != 0) + { + perror("bind error"); + return EXIT_FAILURE; + } + listen(create_socket, 5); + + addrlen = sizeof(struct sockaddr_in); + + struct rec recToSave; + while (1) + { + printf("\x1B[36mWaiting for connections...\n"); + new_socket = accept(create_socket, (struct sockaddr *)&cliaddress, &addrlen); + if (new_socket > 0) + { + printf("\x1B[32mClient connected from %s:%d...\n", inet_ntoa(cliaddress.sin_addr), ntohs(cliaddress.sin_port)); + strcpy(buffer, "\x1B[34mWelcome to myserver, Please enter your command:\x1B[37m\n"); + send(new_socket, buffer, strlen(buffer), 0); + } char bufferString[BUF]; int last = 0; int mode = 0; - do { - size = read (new_socket, buffer, BUF-1); - if( size > 0) + + do + { + size = read(new_socket, buffer, BUF - 1); + if (size > 0) { buffer[size] = '\0'; strcpy(bufferString, buffer); - - if (strncmp (bufferString, "send", 4) == 0 || mode == 1){ + + if (strncmp(bufferString, "send", 4) == 0 || mode == 1) + { switch (last) + { + case 0: + last += 1; + mode = 1; + printf("\x1B[34m"); + printf("->SEND:\x1B[33m %s\x1B[37m\n", bufferString); + bufferString[0] = '\0'; + buffer[0] = '\0'; +fflush(stdout); + break; + case 1: + last += 1; + printf("\x1B[34m"); + printf("->SEND->Sender wurde eingegeben:\x1B[33m %s\x1B[37m\n", bufferString); + char sender[1024]; + strcat(sender, bufferString); + bufferString[0] = '\0'; + buffer[0] = '\0'; +fflush(stdout); + recToSave.sender = sender; + break; + case 2: + last += 1; + printf("\x1B[34m"); + printf("->SEND->Empfänger wurde eingegeben:\x1B[33m %s\x1B[37m\n", bufferString); + char empf[1024]; + strcat(empf, bufferString); + recToSave.receiver = empf; + bufferString[0] = '\0'; + buffer[0] = '\0'; +fflush(stdout); + break; + case 3: + last += 1; + printf("\x1B[34m"); + printf("->SEND->Betreff wurde eingegeben:\x1B[33m %s\x1B[37m\n", bufferString); + char betreff[1024]; + strcat(betreff, bufferString); + recToSave.betreff = betreff; + bufferString[0] = '\0'; + buffer[0] = '\0'; + break; + case 4: + last = 0; + mode = 0; + printf("\x1B[34m"); + printf("->SEND->Nachricht wurde eingegeben:\x1B[33m %s\x1B[37m\n", bufferString); + char msg[1024]; + strcat(msg, bufferString); + recToSave.msg = msg; + printf("BUFFER STRING: %s", bufferString); + bufferString[0] = '\0'; + buffer[0] = '\0'; +fflush(stdout); + printf("Sender: %s, Empf: %s, Betreff: %s, MSG: %s", recToSave.sender, recToSave.receiver, recToSave.betreff, recToSave.msg); + int returnWrite = writeToFile(recToSave.sender, recToSave.betreff, recToSave.receiver, recToSave.msg); + if (returnWrite == 0) { - case 0: - last += 1; - mode = 1; - printf("\x1B[34m"); - printf("->SEND:\x1B[33m %s\n", bufferString); - break; - case 1: - last += 1; - printf("\x1B[34m"); - printf("->SEND->Sender wurde eingegeben:\x1B[33m %s\n", bufferString); - break; - case 2: - last += 1; - printf("\x1B[34m"); - printf("->SEND->Empfänger wurde eingegeben:\x1B[33m %s\n", bufferString); - break; - case 3: - last += 1; - printf("\x1B[34m"); - printf("->SEND->Betreff wurde eingegeben:\x1B[33m %s\n", bufferString); - break; - case 4: - last = 0; - mode = 0; - printf("\x1B[34m"); - printf("->SEND->Nachricht wurde eingegeben:\x1B[33m %s\n", bufferString); - break; - } - }else if (strncmp (bufferString, "list", 4) == 0 ){ + printf("\x1B[31mNachricht konnte nicht gespeichert werden!\x1B[33m\n"); + } + else + { + printf("\x1B[32mNachricht wurde gespeichert!\x1B[33m\n"); + } + break; + } + } + else if (strncmp(bufferString, "list", 4) == 0) + { printf("LIST wurde endlich erkannt!\n"); - }else if (strncmp (bufferString, "read", 4) == 0 ){ + } + else if (strncmp(bufferString, "read", 4) == 0) + { printf("READ wurde endlich erkannt!\n"); - } else if (strncmp (bufferString, "del", 4) == 0 ){ + } + else if (strncmp(bufferString, "del", 4) == 0) + { printf("DEL wurde endlich erkannt!\n"); - }else { - printf ("\x1B[33mBefehl wurde nicht erkannt: \x1B[31m%s\n", bufferString); + } + else + { + printf("\x1B[33mBefehl wurde nicht erkannt: \x1B[31m%s\n", bufferString); } printf("\x1B[37m"); } else if (size == 0) { - printf("Client closed remote socket\n"); + printf("\x1B[33mClient closed remote socket\x1B[37m\n"); break; } else @@ -107,9 +398,9 @@ int main (int argc, char **argv) { perror("recv error"); return EXIT_FAILURE; } - } while ( strncmp (buffer, "quit", 4) != 0); - close (new_socket); - } - close (create_socket); - return EXIT_SUCCESS; -} + } while (strncmp(buffer, "quit", 4) != 0); + close(new_socket); + } + close(create_socket); + return EXIT_SUCCESS; +} \ No newline at end of file