Projet de C/Réseau Création d'une boite aux lettres basée sur les Protocoles TCP et UDP.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tsock.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. //--------------------------PROG C ET RESEAUX-----------------------
  2. // Nom : Quintana
  3. // Prénom : Béranger
  4. // Grp : 3AE E
  5. //------------------------------------------------------------------
  6. #ifndef __tsock__
  7. //---------------------------------------------------
  8. //-------------Déclaration des fonctions-------------
  9. //---------------------------------------------------
  10. void construire_message2(char *message, char motif, int lg, int i);
  11. void afficher_message(char *message, int lg);
  12. void envoi_UDP(int port, int nb_message , int lg_msg, char*dest);
  13. void reception_UDP(int port, int nb_message , int lg_message);
  14. void ClientTCP (int port, int nb_message , int lg_msg, char* dest);
  15. void ServeurTCP(int port , int nb_message, int lg_msg);
  16. void printbuffer(int n);
  17. void printbuffer2(int n , char*message);
  18. //---------------------------------------------------
  19. //---------------------------------------------------
  20. //-------------Définitions des fonctions-------------
  21. //---------------------------------------------------
  22. //---------------------------------------------------
  23. //---------------------------------------------------
  24. //-------------Construire message 2 ----------------- : Construit notre message à partir de l'alphabet
  25. //---------------------------------------------------
  26. void construire_message2(char *message, char motif, int lg, int i)
  27. {
  28. char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
  29. if (i>=27)
  30. {
  31. if (i%26==0)
  32. motif = 'z';
  33. else
  34. motif = alphabet[i%26-1];
  35. }
  36. else
  37. motif=alphabet[i - 1];
  38. for (int j=0;j<lg-5;j++)
  39. {
  40. *(message+j+5) = motif;
  41. }
  42. }
  43. //----------------------------------------------------
  44. //------------------PRINTBUFFER2---------------------- : Modifie la variable message pour écrire le buffer ----# avec # le numéro d'envoi
  45. //----------------------------------------------------
  46. void printbuffer2(int n , char*message)
  47. {
  48. if (n>=100000)
  49. {
  50. printf("Trop de messages à envoyer (n>1000000 \n");
  51. exit(1);
  52. }
  53. if (n<10)
  54. {
  55. for (int i=0 ; i<4 ; i++)
  56. {
  57. *(message+i)='-';
  58. }
  59. //char nb[1];
  60. *(message+4)= n + '0';
  61. }
  62. if (n>=10 & n<100)
  63. {
  64. char nb[2];
  65. for (int i=0 ; i<3 ; i++)
  66. {
  67. *(message+i)='-';
  68. }
  69. sprintf(nb,"%d",n);
  70. *(message+3)=*nb;
  71. n=n%10;
  72. sprintf(nb,"%d", n);
  73. *(message+4)=*nb;
  74. }
  75. if (n>=100 & n<1000)
  76. {
  77. char nb[3];
  78. for (int i=0 ; i<2 ; i++)
  79. {
  80. *(message+i)='-';
  81. }
  82. sprintf(nb,"%d",n);
  83. *(message+2)=*nb;
  84. n=n%100;
  85. sprintf(nb,"%d", n);
  86. *(message+3)=*nb;
  87. n=n%10;
  88. sprintf(nb,"%d", n);
  89. *(message+4)=*nb;
  90. }
  91. if (n>=1000 & n<10000)
  92. {
  93. int j=1000;
  94. char nb[4];
  95. for (int i=0 ; i<2 ; i++)
  96. {
  97. *(message+i)='-';
  98. }
  99. sprintf(nb,"%d",n);
  100. *(message+1)=*nb;
  101. n=n%1000;
  102. sprintf(nb,"%d", n);
  103. *(message+2)=*nb;
  104. n=n%100;
  105. sprintf(nb,"%d", n);
  106. *(message+3)=*nb;
  107. n=n%10;
  108. sprintf(nb,"%d", n);
  109. *(message+4)=*nb;
  110. }
  111. if (n>=10000 & n<100000)
  112. {
  113. char nb[4];
  114. for (int i=0 ; i<2 ; i++)
  115. {
  116. *(message+i)='-';
  117. }
  118. sprintf(nb,"%d",n);
  119. *(message)=*nb;
  120. n=n%10000;
  121. sprintf(nb,"%d", n);
  122. *(message+1)=*nb;
  123. n=n%1000;
  124. sprintf(nb,"%d", n);
  125. *(message+2)=*nb;
  126. n=n%100;
  127. sprintf(nb,"%d", n);
  128. *(message+3)=*nb;
  129. n=n%10;
  130. sprintf(nb,"%d", n);
  131. *(message+4)=*nb;
  132. }
  133. }
  134. //----------------------------------------------------
  135. //-------------Affichage des messages-----------------
  136. //----------------------------------------------------
  137. void afficher_message(char *message, int lg)
  138. {
  139. for (int i=0;i<lg;i++)
  140. printf("%c", *(message+i));
  141. printf("]\n");
  142. }
  143. //----------------------------------------------------
  144. //--------------------Envoi UDP-----------------------
  145. //----------------------------------------------------
  146. void envoi_UDP(int port ,int nb_mess , int lg_msg,char*dest)
  147. {
  148. int length_addr_dist;
  149. length_addr_dist=sizeof(struct sockaddr_in);
  150. int sock;
  151. int sent;
  152. struct sockaddr_in addr_distant;
  153. struct hostent* hp;
  154. char *message=malloc(sizeof(char)*lg_msg) ;
  155. if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur (socket retourne -1 si le socket ne s'ouvre pas comme il faut
  156. {
  157. printf("Erreur à la création du socket\n");
  158. exit(1);
  159. }
  160. memset((char*)&addr_distant,0,sizeof(addr_distant));
  161. addr_distant.sin_family=AF_INET;
  162. addr_distant.sin_port=port;
  163. if((hp=gethostbyname(dest))==NULL)
  164. {
  165. printf("Erreur gethostbyname\n");
  166. exit(1);
  167. }
  168. memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr, hp->h_length);
  169. for (int i=1; i<=nb_mess ; i++)
  170. {
  171. printbuffer2(i,message);
  172. construire_message2(message,'a',lg_msg,i);
  173. printf("SOURCE : Envoi n°%d (%d) : [", i, lg_msg);
  174. if((sent=sendto(sock,message,lg_msg,0,(struct sockaddr*)&addr_distant,sizeof(addr_distant)))==-1)
  175. {
  176. printf("Erreur sendto\n");
  177. exit(1);
  178. }
  179. afficher_message(message,sent);
  180. }
  181. if(close(sock)==-1) //fermeture + test erreur à la fermeture
  182. {
  183. printf("Echec à la destruction du socket\n");
  184. exit(1);
  185. }
  186. }
  187. //----------------------------------------------------
  188. //------------------Reception UDP---------------------
  189. //----------------------------------------------------
  190. void reception_UDP(int port, int nb_message, int lg_message)
  191. {
  192. int sock;
  193. struct sockaddr_in addr_local,addr_distant;
  194. int recv;
  195. int lg_dist;
  196. char *message=malloc(sizeof(char)*lg_message) ;
  197. if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur d'ouverture
  198. {
  199. printf("Erreur à la création du socket\n");
  200. exit(1);
  201. }
  202. memset((char*)&addr_local,0,sizeof(addr_local));//reset de addr_local
  203. addr_local.sin_family=AF_INET; //attribution des différents attributs de addr_local
  204. addr_local.sin_port=port;
  205. addr_local.sin_addr.s_addr=INADDR_ANY; //On dit que l'on veut recevoir sur n'importe quelle carte réseau de notre machine (=INADDR_ANY)
  206. if ((bind(sock,(struct sockaddr*)&addr_local, sizeof(addr_local)))==-1) //bind de la réception + test erreur du bind
  207. {
  208. printf("Echec du Bind\n");
  209. exit(1);
  210. }
  211. lg_dist=sizeof(addr_distant);
  212. int i=1;
  213. while(recv!=0)
  214. {
  215. recv=recvfrom(sock,message,lg_message,0,(struct sockaddr*)&addr_distant,&lg_dist);
  216. if (recv==-1) //process de réception (recvfrom natif à l'API socket, + test erreur
  217. {
  218. printf("Erreur receive from\n");
  219. exit(1);
  220. }
  221. if (recv!=0)
  222. {
  223. printf("PUITS : Réception n°%d (%d) : [",i,lg_message);
  224. afficher_message(message,recv);
  225. }
  226. if (i==nb_message)
  227. {
  228. recv=0;
  229. printf("On a atteint le nombre de messages à recevoir\n");
  230. }
  231. i++;
  232. }
  233. if(close(sock)==-1) //fermeture + test erreur à la fermeture
  234. {
  235. printf("Echec à la destruction du socket\n");
  236. exit(1);
  237. }
  238. }
  239. //----------------------------------------------------
  240. // ----------------ClientTCP <=> source=1-------------
  241. //----------------------------------------------------
  242. void ClientTCP (int port, int nb_message , int lg_msg , char* dest)
  243. {
  244. //Déclarations
  245. int sock;
  246. struct sockaddr_in addr_distant ;
  247. int lg_addr_distant=sizeof(addr_distant);
  248. struct hostent *hp;
  249. char motif;
  250. char * message=malloc(lg_msg*sizeof(char));
  251. int envoi=-1;
  252. //--------Etablissement connexion--------
  253. //Création socket
  254. if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
  255. {
  256. printf("Erreur à l'ouverture du Socket Stream");
  257. exit(1);
  258. }
  259. //Construction adresse socket distant
  260. memset((char*)&addr_distant,0,sizeof(addr_distant));
  261. addr_distant.sin_family=AF_INET; //Internet
  262. addr_distant.sin_port=port; //Numéro de Port
  263. //Affectation IP
  264. if((hp=gethostbyname(dest))==NULL)
  265. {
  266. printf("Erreur de requête IP.\n");
  267. exit(1);
  268. }
  269. memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr , hp->h_length);
  270. //Demande de connexion
  271. if (connect(sock,(struct sockaddr *)&addr_distant,sizeof(addr_distant))==-1)
  272. {
  273. printf("Erreur lors de la connexion, en attente de la tentative suivante \n");
  274. exit(1);
  275. }
  276. //Connexion Réussie !
  277. //----------TRANSFERT DE DONNEES-----------
  278. for (int i=1; i<=nb_message;i++)
  279. {
  280. printf("SOURCE : envoi n°%d (%d) [", i,lg_msg);
  281. //Création du message
  282. construire_message2(message,motif,lg_msg,i);
  283. printbuffer2(i,message);
  284. afficher_message(message,lg_msg);
  285. //Envoi du message
  286. if ((envoi=write(sock,message,lg_msg/*,0,(struct sockaddr*)&addr_distant,lg_addr_distant)*/))==-1)
  287. {
  288. printf("Echec de l'envoi du message (fonction write en défaut)\n");
  289. exit(1);
  290. }
  291. }
  292. //Fermeture connexion
  293. if(shutdown(sock,2)==-1)
  294. {
  295. printf("Erreur à la fermeture de la connexion TCP \n");
  296. exit(1);
  297. }
  298. if (close(sock)==-1)
  299. {
  300. printf("Echec de la fermeture du socket distant");
  301. exit(1);
  302. }
  303. free(message);
  304. printf("Envoi effectué avec succès\n");
  305. }
  306. //------------------------------------------------------------
  307. //----------------ServeurTCP <=> source=0---------------------
  308. //------------------------------------------------------------
  309. void ServeurTCP(int port , int nb_message, int lg_msg)
  310. {
  311. //Déclarations
  312. int sock , sock2; //sock bis local orienté échanges
  313. struct sockaddr* addr_distant;
  314. struct sockaddr_in addr_local;
  315. int lg_addr_distant=sizeof(addr_distant);
  316. int lg_addr_local=sizeof(addr_local);
  317. struct hostent *hp;
  318. char motif;
  319. char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire
  320. int lg_recv=-1;
  321. //-----------------Connexion --------------
  322. //Création socket local
  323. if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
  324. {
  325. printf("Echec de la création d'un socket local\n");
  326. exit(1);
  327. }
  328. //Construction adresse socket local | Affectation port et domaine
  329. memset((char*)&addr_local, 0 , sizeof(addr_local));
  330. addr_local.sin_family=AF_INET;
  331. addr_local.sin_addr.s_addr=INADDR_ANY;
  332. addr_local.sin_port=port;
  333. //Bind
  334. if (bind(sock,(struct sockaddr *)&addr_local, lg_addr_local)==-1)
  335. {
  336. printf("Echec du bind.\n");
  337. exit(1);
  338. }
  339. //Check connexions entrantes
  340. if (listen(sock,100)<0)
  341. {
  342. printf("Trop de connexions en attentes, échec de la demande\n");
  343. exit(1);
  344. }
  345. //Accept connexion
  346. if (nb_message==-1)
  347. nb_message=10;
  348. if ((sock2 = accept(sock,(struct sockaddr*)&addr_distant,&lg_addr_distant))==-1)
  349. {
  350. printf("Refus de connexion par le serveur\n");
  351. exit(1);
  352. }
  353. //Reception des messages au niveau du socket d'échange
  354. //--------------Reception des données-----------
  355. int i=1;
  356. while(lg_recv!=0)
  357. {
  358. if((lg_recv=read(sock2,message, lg_msg))<0)
  359. {
  360. printf("Echec de la lecture du message entrant \n");
  361. exit(1);
  362. }
  363. if (lg_recv!=0)
  364. {
  365. printf("PUITS : Réception n°%d (%d) [" , i , lg_msg);
  366. afficher_message(message, lg_recv);
  367. i++;
  368. }
  369. }
  370. //Ciao le socket
  371. if(close(sock)==-1)
  372. {
  373. printf("Impossible de fermer le socket");
  374. exit(1);
  375. }
  376. free(message);
  377. }
  378. #endif