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_v3_gasc_m.c 8.4KB

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