{"action":"opened","issue":{"url":"https://api.github.com/repos/Altraya/S5_Projet_Reseau/issues/2","labels_url":"https://api.github.com/repos/Altraya/S5_Projet_Reseau/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/Altraya/S5_Projet_Reseau/issues/2/comments","events_url":"https://api.github.com/repos/Altraya/S5_Projet_Reseau/issues/2/events","html_url":"https://github.com/Altraya/S5_Projet_Reseau/issues/2","id":120284907,"number":2,"title":"j'arrive pas à commit alors je fais un issue:D","user":{"login":"EliseAius","id":10079860,"avatar_url":"https://avatars.githubusercontent.com/u/10079860?v=3","gravatar_id":"","url":"https://api.github.com/users/EliseAius","html_url":"https://github.com/EliseAius","followers_url":"https://api.github.com/users/EliseAius/followers","following_url":"https://api.github.com/users/EliseAius/following{/other_user}","gists_url":"https://api.github.com/users/EliseAius/gists{/gist_id}","starred_url":"https://api.github.com/users/EliseAius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EliseAius/subscriptions","organizations_url":"https://api.github.com/users/EliseAius/orgs","repos_url":"https://api.github.com/users/EliseAius/repos","events_url":"https://api.github.com/users/EliseAius/events{/privacy}","received_events_url":"https://api.github.com/users/EliseAius/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-12-03T22:25:55Z","updated_at":"2015-12-03T22:25:55Z","closed_at":null,"body":"/* je sais pas si je suis trop fatiguée ou quoi mais il veut pas commit le serveur de l'exo4 \r\ndonc je le passe comme ça \r\nbref ça craint*/\r\n/*======================================================\r\n\t\t\tserveur.c\r\n\t\t\tBit Alterné\r\n./serveur <fichier_a_envoyer> <fichier_recu> <port_locale>\r\n./serveur envoieServ.txt recuServ.txt 5000\r\n ======================================================*/\r\n\r\n#include <sys/stat.h>\r\n#include <fcntl.h>\r\n#include <unistd.h>\r\n#include <sys/types.h>          \r\n#include <sys/socket.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <arpa/inet.h>\r\n#include <string.h>\r\n#define BUFFER_LENGTH 1024\r\n\r\ntypedef struct message_s \r\n{\r\n\tchar buf[BUFFER_LENGTH];\r\n\tshort int fin;\r\n\tint taille;\r\n\tshort int bit;\r\n}message;\r\n\r\nmessage* initMessage()\r\n{\r\n\tmessage* m = malloc(sizeof(struct message_s));\r\n\tm->fin=0;\r\n\treturn m;\r\n}\r\n\r\nint main(int argc, char **argv)\r\n{\r\n\tif (argc < 4)\r\n\t{\r\n\t\tfprintf(stderr, \"Usage: %s <fichier_a_envoyer>  <fichier_recu> <port_local>\\n\", argv[0]);\r\n\t\texit(1);\r\n\t}\r\n\tchar* nomFichierAEnvoyer = argv[1];\r\n\tchar* nomFichierRecu = argv[2];\r\n\tprintf(\"Nom fichier a envoye: %s\\n\", nomFichierAEnvoyer);\r\n\tprintf(\"Nom fichier recu %s\\n\", nomFichierRecu);\r\n\tint port = atoi(argv[3]);\r\n\tprintf(\"Port : %d\\n\", port);\r\n\r\n\tint input_fd;\r\n\tint output_fd;\r\n\tint nbchar;\r\n\r\n\t//Adresse locale\r\n\tstruct sockaddr_in adrLocale;\r\n\tadrLocale.sin_family = AF_INET;\r\n\tadrLocale.sin_addr.s_addr = htonl(INADDR_ANY);\r\n\tadrLocale.sin_port = htons(port); \r\n\r\n\tint fd;\r\n\tfd=socket(AF_INET,SOCK_DGRAM,0);\r\n\tif(fd==-1)\r\n\t{\r\n\t\tperror(\"socket\");\r\n\t\texit(1);\r\n\t}\r\n\r\n\tif(bind(fd,(struct sockaddr*)&adrLocale,sizeof(adrLocale))==-1)\r\n\t{\r\n\t\tperror(\"bind\");\r\n\t\texit(2);\r\n\t}\r\n\t\r\n\t//Connexion : adresse du client qui nous a contacté\r\n\tstruct sockaddr_in adrDist;\r\n\tadrDist.sin_family = AF_INET;\r\n\r\n\tchar buffConnexion[0];\r\n\tint nbCharCon = 0;\r\n\tsocklen_t b = sizeof(adrDist);\r\n\r\n\tprintf(\"En attente d'une connexion \\n\");\r\n\tnbCharCon = recvfrom(fd, buffConnexion, 0, 0, (struct sockaddr*)&adrDist, &b);\r\n\tprintf(\"Connexion en cours : Le serveur a recu un datagramme de : %d octets\\n\", nbCharCon);\r\n\t\r\n\tprintf(\"Ip adresse locale : %s\\n\", inet_ntoa(adrLocale.sin_addr));\r\n\tprintf(\"Port locale %d\\n\", ntohs(adrLocale.sin_port));\r\n\r\n\r\n\tprintf(\"Ipclient : %s \\n\", inet_ntoa(adrDist.sin_addr));\r\n\tprintf(\"Port client %d\\n\", ntohs(adrDist.sin_port));\r\n\r\n\tprintf(\"Connexion réussie \\n\");\r\n\t\r\n\t// ouvrir le fichier a envoyer en lecture\r\n\tinput_fd = open(nomFichierAEnvoyer, O_RDONLY);\r\n\tif(input_fd<0)\r\n\t{\t\r\n\t\tperror(\"open input\"); \r\n\t\texit(1); \t\t\r\n\t}\r\n\tprintf(\"Ouverture du fichier %s\\n\", nomFichierAEnvoyer);\r\n\r\n\t//check si le fichier existe déjà pour le delete et pas avoir une erreur => plus pratique pour les tests\r\n\t// ouvrir le fichier en ecriture que l'on recoit\r\n\toutput_fd = open(nomFichierRecu, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);\r\n\tif(output_fd<0)\r\n\t{\t\r\n\t\tperror(\"open output\");\r\n\t\texit(1); \t\t\r\n\t}\r\n\tprintf(\"Ouverture du fichier nomFichierRecu %s\\n\", nomFichierRecu);\r\n\r\n\t// copie :\r\n\tmessage* messageRecu = initMessage();\r\n\tmessage* messageAEnvoyer = initMessage();\r\n\tmessage* msg_ack = initMessage();\r\n\tint nbLuEnvoi = 0;\r\n\tint nbLuRecoi = 0;\r\n\tsocklen_t addrDist = sizeof(adrDist);\r\n\tsocklen_t addrLocale = sizeof(adrLocale);\r\n\tshort int ack_v = 0;\r\n\twhile(!(messageRecu->fin && messageAEnvoyer->fin))\r\n\t{\r\n\t\t//tant qu'il y a des messages à recevoir\r\n\t\tif(!messageRecu->fin)\r\n\t\t{\r\n\t\t\tnbLuRecoi = recvfrom(fd, messageRecu, sizeof(message), 0,(struct sockaddr*)&adrLocale, &addrLocale);\r\n\t\t\t//quand on reçoit un message on doit envoyer le ack.\r\n\t\t\tprintf(\"Le serveur a recu %d octets \\n\", nbLuRecoi);\r\n\t\t\tmsg_ack->bit = messageRecu->bit;\r\n\t\t\tmsg_ack->ack = 1;\r\n\t\t\tmsg_ack->buf = \"ceci est un ack :D\";\r\n\t\t\t//si jamais le ack se perd malencontreusement, le client va renvoyer le même message\r\n\t\t\t//qu'il faudra ignorer par la suite.\r\n\t\t\tsendto(fd, msg_ack, sizeof(message), 0, (struct sockaddr*)&adrDist, addrDist);\r\n\t\t\tif(messageRecu->fin)\r\n\t\t\t\tprintf(\"Le serveur ferme la connexion l'émetteur (client) a envoyé une demande de fermeture\\n\");\r\n\t\t\t//si on a bien la trame attendue on consomme les données\r\n\t\t\tif(messageRecu->bit==ack_v)\r\n\t\t\t{\r\n\t\t\t\twrite(output_fd, messageRecu->buf, messageRecu->taille);\r\n\t\t\t}\r\n\t\t\t//sinon, on s'en branle\r\n\r\n\t\t\t//on actualise le numéro de la prochaine trame attendue\r\n\t\t\t(ack_v+=1)%2; \r\n\t\t}\r\n\r\n\t\tif(!messageAEnvoyer->fin)\r\n\t\t{\r\n\t\t\tnbLuEnvoi = read(input_fd, messageAEnvoyer->buf, BUFFER_LENGTH);\r\n\t\t\tmessageAEnvoyer->taille=nbLuEnvoi;\r\n\t\t\tif(nbLuEnvoi < BUFFER_LENGTH)\r\n\t\t\t{\r\n\t\t\t\tmessageAEnvoyer->fin=1;\r\n\t\t\t\tprintf(\"Le serveur envoi une demande de fermeture de connexion \\n\");\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tnbchar=sendto(fd, messageAEnvoyer, sizeof(message), 0, (struct sockaddr*)&adrDist, addrDist);\r\n\t\t\tprintf(\"Le serveur envoi %d octets \\n\", nbchar);\r\n\t\t}\r\n\r\n\t}\r\n\tclose(input_fd);\r\n\tclose(output_fd);\r\n\treturn 0;\r\n}\r\n"}}