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_v2_gasc_m.c 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  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 2 - 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\n");
  34. }
  35. /// Affiche erreur connexion
  36. void err_conn(){
  37. printf("\n[-] Erreur lors de la connexion serveur/client\n");
  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. if (c >= '{') c = 'a';
  92. }
  93. return 0;
  94. }
  95. int puit_UDP(int PORT, int nb_message, int l_msg) {
  96. // Création du socket UDP
  97. printf("[+] Création du socket local...");
  98. int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
  99. if (s_udp == -1){
  100. err_socks();
  101. return 1;
  102. } else printf("Ok!\n");
  103. struct sockaddr_in servaddr, cliaddr;
  104. memset(&servaddr, 0, sizeof(servaddr));
  105. memset(&cliaddr, 0, sizeof(cliaddr));
  106. servaddr.sin_family = AF_INET;
  107. servaddr.sin_addr.s_addr = INADDR_ANY;
  108. servaddr.sin_port = PORT;
  109. if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
  110. err_socks();
  111. return 1;
  112. }
  113. printf("[+] Bind ok !\n");
  114. int n;
  115. int len;
  116. int msg_count = 0;
  117. char buffer[l_msg];
  118. printf("[+] Waiting for messages...\n");
  119. while (msg_count >= nb_message || nb_message != -1){
  120. n = recvfrom(s_udp, (char *)buffer, l_msg,
  121. MSG_WAITALL, (struct sockaddr *) &cliaddr,
  122. &len);
  123. buffer[n] = '\0';
  124. printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
  125. n = 0;
  126. msg_count++;
  127. }
  128. return 0;
  129. }
  130. ////////////////////////////TCP/////////////////////////////
  131. int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
  132. // Création du socket TCP
  133. printf("[+] Création du socket local...");
  134. int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
  135. if (s_tcp == -1){
  136. err_socks();
  137. return 1;
  138. } else printf("Ok!\n");
  139. // Création du socket distant
  140. printf("[+] Création du socket distant...");
  141. struct sockaddr_in servaddr;
  142. memset(&servaddr, 0, sizeof(servaddr));
  143. struct hostent *hp ;
  144. // Résolution du nom
  145. if ((hp = gethostbyname(HOSTNAME)) == NULL) {
  146. err_conn();
  147. return 1;
  148. }
  149. // Creation de la struct du socket distant
  150. servaddr.sin_family = AF_INET;
  151. memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
  152. servaddr.sin_port = PORT;
  153. printf("Ok!\n");
  154. if (connect(s_tcp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
  155. err_conn();
  156. return 1;
  157. }
  158. printf("[+] Envoi des messages...\n");
  159. // TEST
  160. char *pmesg = malloc(l_msg*sizeof(char));
  161. char c = 'a';
  162. // Création des messages à envoyer et envoi
  163. for (int i = 1; i <= nb_message; i++){
  164. construire_message(pmesg, c, l_msg);
  165. afficher_message(pmesg, l_msg);
  166. if (write(s_tcp, pmesg, l_msg) < 0){
  167. err_conn();
  168. return 1;
  169. }
  170. c++;
  171. if (c >= '{') c = 'a';
  172. }
  173. close(s_tcp);
  174. return 0;
  175. }
  176. int puit_TCP(int PORT, int nb_message, int l_msg){
  177. // Création du socket TCP
  178. printf("[+] Création du socket local...");
  179. int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
  180. if (s_tcp == -1){
  181. err_socks();
  182. return 1;
  183. } else printf("Ok!\n");
  184. struct sockaddr_in servaddr, cliaddr;
  185. memset(&servaddr, 0, sizeof(servaddr));
  186. memset(&cliaddr, 0, sizeof(cliaddr));
  187. servaddr.sin_family = AF_INET;
  188. servaddr.sin_addr.s_addr = INADDR_ANY;
  189. servaddr.sin_port = PORT;
  190. if (bind(s_tcp, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
  191. err_socks();
  192. return 1;
  193. }
  194. printf("[+] Bind ok !\n");
  195. if (listen(s_tcp, 5) != 0){
  196. err_conn();
  197. return 1;
  198. }
  199. printf("[+] Listening on port %d\n", PORT);
  200. int s_conn, l_recpt, msg_count = 1;
  201. int lg_cliaddr = sizeof(cliaddr);
  202. if ((s_conn = accept(s_tcp, (struct sockaddr *)&cliaddr, &lg_cliaddr)) < 0){
  203. err_conn();
  204. return 1;
  205. }
  206. printf("[+] Connection accepted\n");
  207. int n;
  208. char buffer[l_msg];
  209. printf("[+] Waiting for messages...\n");
  210. while (msg_count <= nb_message || nb_message == -1){
  211. if ((l_recpt = read(s_conn, buffer, sizeof(buffer))) < 0){
  212. err_conn();
  213. return 1;
  214. }
  215. if (l_recpt > 0){
  216. printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
  217. n = 0;
  218. msg_count++;
  219. bzero(buffer, l_msg);
  220. }
  221. }
  222. return 0;
  223. }
  224. ///////////////////////////////////////////////////////////
  225. /// Main entry
  226. int main (int argc, char **argv)
  227. {
  228. int c;
  229. extern char *optarg;
  230. extern int optind;
  231. int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
  232. int source = -1; /* 0 = puits, 1 = source */
  233. int tcp = 1; /* 0 = UDP, 1 = TCP */
  234. int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
  235. while ((c = getopt(argc, argv, "pn:su")) != -1) {
  236. switch (c) {
  237. case 'p':
  238. if (source == 1) {
  239. err_args();
  240. }
  241. source = 0;
  242. break;
  243. case 's':
  244. if (source == 0) {
  245. err_args();
  246. }
  247. source = 1;
  248. break;
  249. case 'n':
  250. nb_message = atoi(optarg);
  251. break;
  252. case 'u':
  253. tcp = 0;
  254. break;
  255. default:
  256. err_args();
  257. break;
  258. }
  259. }
  260. int PORT = atoi(argv[argc-1]);
  261. //PORT = htons(PORT);
  262. if (source == -1) {
  263. err_args();
  264. }
  265. if (tcp)
  266. printf("[+] On utilise le protocol TCP\n");
  267. else
  268. printf("[+] On utilise le protocol UDP\n");
  269. char* HOSTNAME = "";
  270. if (source == 1){
  271. printf("[+] On est dans la source\n");
  272. HOSTNAME = argv[argc-2];
  273. }
  274. else
  275. printf("[+] On est dans le puit\n");
  276. if (nb_message != -1) {
  277. if (source == 1)
  278. printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
  279. else
  280. printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
  281. } else {
  282. if (source == 1) {
  283. nb_message = 10 ;
  284. printf("[~] Nombre de tampons à envoyer : 10 par défaut\n");
  285. }
  286. else
  287. printf("[+] Nombre de tampons à envoyer : infini\n");
  288. }
  289. if (l_msg == 30)
  290. printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
  291. else
  292. printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
  293. int s = 1;
  294. // Choose the right function
  295. if (tcp){
  296. if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
  297. else s = puit_TCP(PORT, nb_message, l_msg);
  298. }
  299. else {
  300. if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
  301. else s = puit_UDP(PORT, nb_message, l_msg);
  302. }
  303. return s;
  304. }