/* librairie standard ... */ /* déclaration des types de base */ #include /* constantes relatives aux domaines, types et protocoles */ #include #include /* constantes et structures propres au domaine INTERNET */ #include /* structures retournées par les fonctions de gestion de la base de données du réseau */ #include /* pour les entrées/sorties */ #include /* la lib standard */ #include /* pour memcpy */ #include #include int main(int argc, char *argv[]) { if (argc != 3) { printf("ERREUR : Usage : ./client AdresseServeur N°Port\n"); exit(2); } int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("ERREUR lors de la création du socket\n"); exit(1); } // On cree l'adresse du socket target struct sockaddr_in addr_target; addr_target.sin_family = AF_INET; addr_target.sin_port = htons(atoi(argv[2])); struct hostent *hoststruct = gethostbyname(argv[1]); if (hoststruct == NULL) { printf("ERREUR lors de la recherche de l'adresse IP du target\n"); exit(2); } memcpy((char *) &(addr_target.sin_addr.s_addr), hoststruct->h_addr, hoststruct->h_length); int retour_connexion; //On fait de demande de connextion au socket target retour_connexion = connect(sock, (struct sockaddr *) &addr_target, sizeof(struct sockaddr_in)); if (retour_connexion == -1) { printf("ERREUR lors de la demande de connexion\n"); exit(3); } printf("Que souhaitez vous faire : \n - READ 'index'\n - WRITE 'value' 'index'\n - ADD 'index1' 'index2' 'index3'\n - SUB 'index1' 'index2' 'index3'\n - MUL 'index1' 'index2' 'index3'\n - DIV 'index1' 'index2' 'index3'\n - LOWER 'index1' 'index2'\n - EQUAL 'index1' 'index2'\n - PRINT\n - QUIT\n"); while (1) { // Test si le serveur a crash usleep(100000); int oldflag = fcntl(sock, F_GETFL); char buff2[40] = "\0"; fcntl(sock, F_SETFL, oldflag | O_NONBLOCK); if ((int) read(sock, buff2, 40) == 0) { printf("--- Socket closed ---\n"); close(sock); exit(0); } else if (strcmp(buff2, "SEGFAULT") == 0) { printf("--- Segfault in server ---\n"); close(sock); exit(4); } fcntl(sock, F_SETFL, oldflag); // Lecture de la requette char requete[40]; fgets(requete, 40, stdin); char req[10] = "\0"; int param1 = -1; int param2 = -1; int param3 = -1; sscanf(requete, "%s %d %d %d", req, ¶m1, ¶m2, ¶m3); // Traitement de la requette char buff[40] = "\0"; int nb_octets_envoyes; if (!strcmp(req, "READ") || !strcmp(req, "read")) { if (param1 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "r.%d.0.0", param1); nb_octets_envoyes = send(sock, buff, strlen(buff), 0); printf("nb_octets_envoyes = %d\n", nb_octets_envoyes); int bytesRead = read(sock, buff, 40); if (bytesRead > 0) { int val; printf("%s\n", buff); sscanf(buff, "%d", &val); printf("Tableau[%d] = %d\n", param1, val); } else { printf("Erreur lors du read\n"); } } } else if (!strcmp(req, "WRITE") || !strcmp(req, "write")) { if (param2 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "w.%d.%d.0", param1, param2); send(sock, buff, strlen(buff), 0); } } else if (!strcmp(req, "ADD") || !strcmp(req, "add")) { if (param1 < 0 || param2 < 0 || param3 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "a.%d.%d.%d", param1, param2, param3); send(sock, buff, strlen(buff), 0); } } else if (!strcmp(req, "SUB") || !strcmp(req, "sub")) { if (param1 < 0 || param2 < 0 || param3 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "s.%d.%d.%d", param1, param2, param3); send(sock, buff, strlen(buff), 0); } } else if (!strcmp(req, "MUL") || !strcmp(req, "mul")) { if (param1 < 0 || param2 < 0 || param3 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "m.%d.%d.%d", param1, param2, param3); send(sock, buff, strlen(buff), 0); } } else if (!strcmp(req, "DIV") || !strcmp(req, "div")) { if (param1 < 0 || param2 < 0 || param3 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "d.%d.%d.%d", param1, param2, param3); send(sock, buff, strlen(buff), 0); } } else if (!strcmp(req, "LOWER") || !strcmp(req, "lower")) { if (param1 < 0 || param2 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "l.%d.%d.0", param1, param2); send(sock, buff, strlen(buff), 0); char retour[2]; read(sock, retour, 2); char res[6]; if (!strcmp(retour, "1")) { strcpy(res, "TRUE"); } else if (!strcmp(retour, "0")) { strcpy(res, "FALSE"); } else { strcpy(res, "ERROR"); } printf("Tableau[%d] < Tableau[%d] => %s\n", param1, param2, res); } } else if (!strcmp(req, "EQUAL") || !strcmp(req, "equal")) { if (param1 < 0 || param2 < 0) { printf("ERROR SYNTAX\n"); } else { sprintf(buff, "e.%d.%d.0", param1, param2); send(sock, buff, strlen(buff), 0); char retour[2]; read(sock, retour, 2); char res[6]; if (!strcmp(retour, "1")) { strcpy(res, "TRUE"); } else if (!strcmp(retour, "0")) { strcpy(res, "FALSE"); } else { strcpy(res, "ERROR"); } printf("Tableau[%d] == Tableau[%d] => %s\n", param1, param2, res); } } else if (!strcmp(req, "PRINT") || !strcmp(req, "print")) { sprintf(buff, "p.0.0.0"); send(sock, buff, strlen(buff), 0); } else if (!strcmp(req, "QUIT") || !strcmp(req, "quit")) { sprintf(buff, "q.0.0.0"); send(sock, buff, strlen(buff), 0); } else { printf("SYNTAX ERROR\n"); } } }