Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. //Prog.c
  2. //usage: prog [-t|-u][-x][-h|-n] hostname servicename
  3. // -t TCP (def)
  4. // -u UDP
  5. // -x HEX
  6. // -h host byte order (def)
  7. // -n network byte order
  8.  
  9. //povratne vrijednosti: 0 - sve OK; neki broj za krivi unos argumenata, neki broj za nepostojeci servis/host
  10. //ispisati std. error (postoji funkcija)
  11.  
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <err.h>
  17. #include <netinet/in.h>
  18. #include <errno.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <netdb.h>
  22. #include <string.h>
  23. #include <arpa/inet.h>
  24.  
  25.  
  26. int main(int argc, char *argv[]) {
  27. int err, option, TCPFlag = 1, UDPFlag = 0, HEXFlag = 0, HBOFlag = 1, NBOFlag = 0;
  28. int type, mysocket;
  29. char addrstr[100], *error;
  30. struct sockaddr_in myaddr;
  31. struct addrinfo hints, *result;
  32. struct servent *server;
  33.  
  34. if (argc < 3) { //inicijalna provjera ulaznih argumenata
  35. printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n");
  36. return 2;
  37. }
  38.  
  39. //Provjera zastavica
  40. while((option = getopt(argc, argv, "tuxhn")) != -1) {
  41. switch (option) {
  42. case 't': TCPFlag = 1;
  43. break;
  44. case 'u': UDPFlag = 1;
  45. break;
  46. case 'x': HEXFlag = 1;
  47. break;
  48. case 'h': HBOFlag = 1;
  49. break;
  50. case 'n': NBOFlag = 1;
  51. break;
  52. default: printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n"); //dana nepoznata opcija
  53. return 2;
  54. }
  55. }
  56.  
  57. if (argc - optind != 2) { //nisu dani svi nuzni argumenti
  58. printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n");
  59. return 2;
  60. }
  61.  
  62. if (UDPFlag)
  63. type = SOCK_DGRAM;
  64. else
  65. type = SOCK_STREAM;
  66.  
  67. //Stvori socket
  68. mysocket = socket(PF_INET, type, 0); // 0 za def. IP; mozda 6 za TCP i 17 za UDP
  69. if (mysocket == -1) {
  70. //errx(24, "%s", gai_strerror(err));
  71. error = strerror(errno);
  72. printf("%s\n", error);
  73. return 24;
  74. }
  75.  
  76.  
  77. //Moji podaci (IP i port)
  78. myaddr.sin_family = AF_INET;
  79. myaddr.sin_port = htons(0);
  80. myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  81.  
  82. //Povezi socket sa svoje strane
  83. err = bind(mysocket, (struct sockaddr *) &myaddr, sizeof(myaddr));
  84. if (err) {
  85. error = strerror(errno);
  86. printf("%s\n", error);
  87. //errx(24, "%s", gai_strerror(err));
  88. return 24;
  89. }
  90.  
  91.  
  92. memset(&hints, 0, sizeof(hints));
  93. hints.ai_family = AF_INET;
  94. hints.ai_flags |= AI_CANONNAME;
  95. err = getaddrinfo(argv[argc-2], argv[argc-1], &hints, &result); //povezi se i provjeri
  96. if (err) {
  97. error = strerror(errno);
  98. printf("%s\n", error);
  99. //errx(25, "%s", gai_strerror(err));
  100. return 25;
  101. }
  102.  
  103.  
  104. inet_ntop(result->ai_family, &((struct sockaddr_in *) result->ai_addr)->sin_addr, addrstr, 100);
  105.  
  106. //Koji protokol
  107. if (UDPFlag)
  108. server = getservbyname(argv[argc-1], "udp"); //dobiva u network byte orderu
  109. else
  110. server = getservbyname(argv[argc-1], "tcp");
  111.  
  112. if (server == NULL) {
  113. printf("servname not supported for ai_socktype\n"); //TODO: kako dobiti pravi error
  114. return 25;
  115. }
  116. //Koji redosljed ispisa rezultata
  117. if (!NBOFlag)
  118. server->s_port = ntohs(server->s_port);
  119.  
  120.  
  121. //Hex ili Dec
  122. if (HEXFlag)
  123. printf("%s (%s) %x\n", addrstr, result->ai_canonname, server->s_port); //hex vrijednost
  124. else
  125. printf("%s (%s) %d\n", addrstr, result->ai_canonname, server->s_port); //dec vrijednost
  126.  
  127. //Ciscenje
  128. freeaddrinfo(result);
  129. close(mysocket);
  130. return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement