Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Prog.c
- //usage: prog [-t|-u][-x][-h|-n] hostname servicename
- // -t TCP (def)
- // -u UDP
- // -x HEX
- // -h host byte order (def)
- // -n network byte order
- //povratne vrijednosti: 0 - sve OK; neki broj za krivi unos argumenata, neki broj za nepostojeci servis/host
- //ispisati std. error (postoji funkcija)
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <err.h>
- #include <netinet/in.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <string.h>
- #include <arpa/inet.h>
- int main(int argc, char *argv[]) {
- int err, option, TCPFlag = 1, UDPFlag = 0, HEXFlag = 0, HBOFlag = 1, NBOFlag = 0;
- int type, mysocket;
- char addrstr[100], *error;
- struct sockaddr_in myaddr;
- struct addrinfo hints, *result;
- struct servent *server;
- if (argc < 3) { //inicijalna provjera ulaznih argumenata
- printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n");
- return 2;
- }
- //Provjera zastavica
- while((option = getopt(argc, argv, "tuxhn")) != -1) {
- switch (option) {
- case 't': TCPFlag = 1;
- break;
- case 'u': UDPFlag = 1;
- break;
- case 'x': HEXFlag = 1;
- break;
- case 'h': HBOFlag = 1;
- break;
- case 'n': NBOFlag = 1;
- break;
- default: printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n"); //dana nepoznata opcija
- return 2;
- }
- }
- if (argc - optind != 2) { //nisu dani svi nuzni argumenti
- printf("Usage: prog [-t|-u][-x][-h|-n] hostname servicename\n");
- return 2;
- }
- if (UDPFlag)
- type = SOCK_DGRAM;
- else
- type = SOCK_STREAM;
- //Stvori socket
- mysocket = socket(PF_INET, type, 0); // 0 za def. IP; mozda 6 za TCP i 17 za UDP
- if (mysocket == -1) {
- //errx(24, "%s", gai_strerror(err));
- error = strerror(errno);
- printf("%s\n", error);
- return 24;
- }
- //Moji podaci (IP i port)
- myaddr.sin_family = AF_INET;
- myaddr.sin_port = htons(0);
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- //Povezi socket sa svoje strane
- err = bind(mysocket, (struct sockaddr *) &myaddr, sizeof(myaddr));
- if (err) {
- error = strerror(errno);
- printf("%s\n", error);
- //errx(24, "%s", gai_strerror(err));
- return 24;
- }
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_INET;
- hints.ai_flags |= AI_CANONNAME;
- err = getaddrinfo(argv[argc-2], argv[argc-1], &hints, &result); //povezi se i provjeri
- if (err) {
- error = strerror(errno);
- printf("%s\n", error);
- //errx(25, "%s", gai_strerror(err));
- return 25;
- }
- inet_ntop(result->ai_family, &((struct sockaddr_in *) result->ai_addr)->sin_addr, addrstr, 100);
- //Koji protokol
- if (UDPFlag)
- server = getservbyname(argv[argc-1], "udp"); //dobiva u network byte orderu
- else
- server = getservbyname(argv[argc-1], "tcp");
- if (server == NULL) {
- printf("servname not supported for ai_socktype\n"); //TODO: kako dobiti pravi error
- return 25;
- }
- //Koji redosljed ispisa rezultata
- if (!NBOFlag)
- server->s_port = ntohs(server->s_port);
- //Hex ili Dec
- if (HEXFlag)
- printf("%s (%s) %x\n", addrstr, result->ai_canonname, server->s_port); //hex vrijednost
- else
- printf("%s (%s) %d\n", addrstr, result->ai_canonname, server->s_port); //dec vrijednost
- //Ciscenje
- freeaddrinfo(result);
- close(mysocket);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement