No Description
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_v1_gasc_m.c 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /* librairie standard ... */
  2. #include <stdlib.h>
  3. /* pour getopt */
  4. #include <unistd.h>
  5. /* déclaration des types de base */
  6. #include <sys/types.h>
  7. /* constantes relatives aux domaines, types et protocoles */
  8. #include <sys/socket.h>
  9. /* constantes et structures propres au domaine UNIX */
  10. #include <sys/un.h>
  11. /* constantes et structures propres au domaine INTERNET */
  12. #include <netinet/in.h>
  13. /* structures retournées par les fonctions de gestion de la base de
  14. données du réseau */
  15. #include <netdb.h>
  16. /* pour les entrées/sorties */
  17. #include <stdio.h>
  18. /* pour la gestion des erreurs */
  19. #include <errno.h>
  20. /*
  21. TP AIPS
  22. Version 1 - Fonctionnelle
  23. */
  24. ///////////////////////////////////////////////////////////
  25. // Fonctions d'erreurs
  26. /// Afficher l'usage et quitte
  27. void err_args() {
  28. printf("[!] Usage: cmd [-u][-p|-s][-n ##][-l ##]\n");
  29. exit(EXIT_FAILURE);
  30. }
  31. /// Affiche erreur socket
  32. void err_socks(){
  33. printf("\n[-] Erreur lors de la création/affectation du socket");
  34. }
  35. /// Affiche erreur connexion
  36. void err_conn(){
  37. printf("\n[-] Erreur lors de la connexion serveur/client");
  38. }
  39. ///////////////////////////////////////////////////////////
  40. // Given functions
  41. void construire_message(char *message, char motif, int lg) {
  42. int i;
  43. for (i=0;i<lg;i++) message[i] = motif;
  44. }
  45. void afficher_message(char *message, int lg) {
  46. int i;
  47. printf("[+] Message construit : ");
  48. for (i=0;i<lg;i++) printf("%c", message[i]);
  49. printf("\n");
  50. }
  51. ///////////////////////////UDP/////////////////////////////
  52. int source_UDP(char *HOSTNAME, int PORT, int nb_message, int l_msg) {
  53. // Création du socket UDP
  54. printf("[+] Création du socket local...");
  55. int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
  56. if (s_udp == -1){
  57. err_socks();
  58. return 1;
  59. } else printf("Ok!\n");
  60. // Création du socket distant
  61. printf("[+] Création du socket distant...");
  62. struct sockaddr_in servaddr;
  63. memset(&servaddr, 0, sizeof(servaddr));
  64. struct hostent *hp ;
  65. // Résolution du nom
  66. if ((hp = gethostbyname(HOSTNAME)) == NULL) {
  67. err_conn();
  68. return 1;
  69. }
  70. // Creation de la struct du socket distant
  71. servaddr.sin_family = AF_INET;
  72. memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
  73. servaddr.sin_port = PORT;
  74. printf("Ok!\n");
  75. printf("[+] Envoi des messages à %s:%d...\n", HOSTNAME, PORT);
  76. // TEST
  77. char *pmesg = malloc(l_msg*sizeof(char));
  78. char c = 'a';
  79. // Création des messages à envoyer et envoi
  80. for (int i = 1; i <= nb_message; i++){
  81. construire_message(pmesg, c, l_msg);
  82. afficher_message(pmesg, l_msg);
  83. sendto(s_udp,
  84. pmesg,
  85. strlen(pmesg),
  86. 0,
  87. (const struct sockaddr *) &servaddr,
  88. sizeof(servaddr)
  89. );
  90. c++;
  91. }
  92. return 0;
  93. }
  94. int puit_UDP(int PORT, int nb_message, int l_msg) {
  95. // Création du socket UDP
  96. printf("[+] Création du socket local...");
  97. int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
  98. if (s_udp == -1){
  99. err_socks();
  100. return 1;
  101. } else printf("Ok!\n");
  102. struct sockaddr_in servaddr, cliaddr;
  103. memset(&servaddr, 0, sizeof(servaddr));
  104. memset(&cliaddr, 0, sizeof(cliaddr));
  105. servaddr.sin_family = AF_INET;
  106. servaddr.sin_addr.s_addr = INADDR_ANY;
  107. servaddr.sin_port = PORT;
  108. if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
  109. err_socks();
  110. return 1;
  111. }
  112. printf("[+] Bind ok !\n");
  113. int n;
  114. int len;
  115. int msg_count = 0;
  116. char buffer[l_msg];
  117. printf("[+] Waiting for messages...\n");
  118. while (msg_count >= nb_message || nb_message != -1){
  119. n = recvfrom(s_udp, (char *)buffer, l_msg,
  120. MSG_WAITALL, (struct sockaddr *) &cliaddr,
  121. &len);
  122. buffer[n] = '\0';
  123. printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
  124. n = 0;
  125. msg_count++;
  126. }
  127. return 0;
  128. }
  129. ////////////////////////////TCP/////////////////////////////
  130. int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
  131. return 1;
  132. }
  133. int puit_TCP(int PORT, int nb_message, int l_msg){
  134. return 1;
  135. }
  136. ///////////////////////////////////////////////////////////
  137. /// Main entry
  138. int main (int argc, char **argv)
  139. {
  140. int c;
  141. extern char *optarg;
  142. extern int optind;
  143. int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
  144. int source = -1; /* 0 = puits, 1 = source */
  145. int tcp = 1; /* 0 = UDP, 1 = TCP */
  146. int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
  147. while ((c = getopt(argc, argv, "pn:sul:")) != -1) {
  148. switch (c) {
  149. case 'p':
  150. if (source == 1) {
  151. err_args();
  152. }
  153. source = 0;
  154. break;
  155. case 's':
  156. if (source == 0) {
  157. err_args();
  158. }
  159. source = 1;
  160. break;
  161. case 'n':
  162. nb_message = atoi(optarg);
  163. break;
  164. case 'u':
  165. tcp = 0;
  166. break;
  167. case 'l':
  168. l_msg = atoi(optarg);
  169. default:
  170. err_args();
  171. break;
  172. }
  173. }
  174. int PORT = atoi(argv[argc-1]);
  175. //PORT = htons(PORT);
  176. if (source == -1) {
  177. err_args();
  178. }
  179. if (tcp)
  180. printf("[+] On utilise le protocol TCP\n");
  181. else
  182. printf("[+] On utilise le protocol UDP\n");
  183. char* HOSTNAME = "";
  184. if (source == 1){
  185. printf("[+] On est dans la source\n");
  186. HOSTNAME = argv[argc-2];
  187. }
  188. else
  189. printf("[+] On est dans le puit\n");
  190. if (nb_message != -1) {
  191. if (source == 1)
  192. printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
  193. else
  194. printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
  195. } else {
  196. if (source == 1) {
  197. nb_message = 10 ;
  198. printf("[~] Nombre de tampons à envoyer = 10 par défaut\n");
  199. }
  200. else
  201. printf("[+] Nombre de tampons à envoyer = infini\n");
  202. }
  203. if (l_msg == 30)
  204. printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
  205. else
  206. printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
  207. int s = 1;
  208. // Choose the right function
  209. if (tcp){
  210. if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
  211. else s = puit_TCP(PORT, nb_message, l_msg);
  212. }
  213. else {
  214. if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
  215. else s = puit_UDP(PORT, nb_message, l_msg);
  216. }
  217. return s;
  218. }