nazwy_hostow.c

#include <netdb.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

main(int argc, char **argv) {
  int i=0;
  char buff[40];
  void* adres;
  
  // zamiana nazwy na adresy
  struct hostent *info1 = gethostbyname(argv[1]);
  if (info1 == NULL) {
    herror("gethostbyname: ");
    return -1;
  }

  struct in_addr adres_v4;
  struct in6_addr adres_v6;
  // opisy in6_addr i sockaddr_in6 w man 7 ipv6
  // opisy in_addr i sockaddr_in w man 7 ip
  
  // wypisanie uzyskanych informacji
  printf("%s MA ADRESY (%d %d):\n", info1->h_name, info1->h_addrtype, info1->h_length);
  while (info1->h_addr_list[i]) {
    if (info1->h_addrtype == AF_INET) {
      adres = &adres_v4;
      memcpy ((void *) &adres_v4.s_addr, (void*)info1->h_addr_list[i], info1->h_length);
      printf("\tadres ip w postaci HEX: %x (%x)\n", adres_v4.s_addr, *((int*)info1->h_addr_list[i]));
    } else if (info1->h_addrtype == AF_INET6) {
      adres = &adres_v6;
      memcpy ((void *) &adres_v6.s6_addr, (void*)info1->h_addr_list[i], info1->h_length);
      printf("\tadres ip w postaci HEX: ");
      for (i=0; i<16; i++)
        printf("%x ", adres_v6.s6_addr[i]);
      printf("\n");
    }
    
    // konwersja wartości numerycznej na ludzki zapis adresu
    // funkcja inet_ntop rozpoznaje przyjmowany typ struktury
    // mogą to być n6_addr, sockaddr_in6, in_addr, sockaddr_in
    if (!inet_ntop  (info1->h_addrtype, adres, buff, 40)) {
      perror( "próba zamiany adresu nieudana" );
      return -1;
    }
    printf("\t%s %s\n\n", info1->h_aliases[i], buff);
    i++;
  }
  
  
  
  struct addrinfo *info2;
  errno = 0;
  int error = getaddrinfo(argv[1], NULL, NULL, &info2);
  if (error != 0) {
    perror("getaddrinfo: ");
    printf("getaddrinfo: %d %s\n", error, gai_strerror(error));
  }
  
  struct sockaddr_in *socket_v4;
  struct sockaddr_in6 *socket_v6;
  
  printf("Za pomocą getaddrinfo\n");
  do {
    // UIWAGA: to co siedzi w info2->ai_addr to sockaddr_in lub sockaddr_in6 a nie sockaddr !!!
    if (info2->ai_family == AF_INET) {
      socket_v4 = (const struct sockaddr_in*) info2->ai_addr;
      adres = &socket_v4->sin_addr;
      printf("\tadres ip w postaci HEX: %x\n", socket_v4->sin_addr.s_addr);
    } else if (info2->ai_family == AF_INET6) {
      socket_v6 = (const struct sockaddr_in6*) info2->ai_addr;
      adres = &socket_v6->sin6_addr;
      printf("\tadres ip w postaci HEX: ");
      for (i=0; i<16; i++)
        printf("%x ", socket_v6->sin6_addr.s6_addr[i]);
      printf("\n");
    }
    
    // konwersja wartości numerycznej na ludzki zapis adresu
    if (!inet_ntop  (info2->ai_family, adres, buff, 40)) {
      perror( "próba zamiany adresu nieudana" );
      return -1;
    }
    printf("\t%s %s (%d %d)\n\n", info2->ai_canonname, buff, info2->ai_family, info2->ai_addrlen);
    
    // bierzemy następny z uzyskanych adresów
    info2=info2->ai_next;
  } while(info2!=NULL);
}

XHTML generated by highlight (http://www.andre-simon.de/) from nazwy_hostow.c



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/nazwy_hostow.c) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).