numeracja_ipv6.c

/**
  * program oblicza adres sieci
  * na podstawie podanego adresu IPv6 hosta z tej sieci i maski
**/

#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>

main (int argc, char *argv[], char *envp[]) {
  if (argc != 3){
    puts("zla liczba argumentow");
    return -1;
  }
  
  // konwertujemy adres IPv6 z napisu na strukture, zawierajaca tablice 16 bajtow
  // odpowiadajacyh kolejnym bajtom adresu
  struct in6_addr adres; 
  if (inet_pton(AF_INET6, argv[1], &adres) <= 0 ) {
    if (errno == 0)
      puts( "podany adres jest nieprawidlowy");
      // inet_pton nie ustawia wtedy errno ale zwrac 0 ...
    else
      perror( "próba zamiany adresu nieudana" );
    return -2;
  }
  
  // tworzymy analogiczna strukture z tablica odpowiadajaca bajtom maski
  int msk = atoi(argv[2]);
  struct in6_addr maska;
  
  int i;
  for (i=0; i<16; i++){
    
    if (i<msk/8) // (1)
      maska.s6_addr[i]=0xff;
    else if (i==msk/8) // (2)
      maska.s6_addr[i]=(0xff << (8-msk%8));
    else // (3)
      maska.s6_addr[i]=0;
  }
  
  // wykonujemy and binarny miedzy adresem ip hosta a maska otrzymujac adres sieci
  // w zasadzie mozna by to zrobic w powyzeszej petli - zamiast tworzyc pelny opis maski
  // dla (1) nic nie robic, dla (2) wykonac and dla tego bajtu dla (3) wyzerowac bajty adresu
  for (i=0; i<16; i++)
    adres.s6_addr[i] = maska.s6_addr[i] & adres.s6_addr[i];
  
  // wypisujemy (dokonujac konwersji na postac napisowa) otrzymany adres sieci
  char dst[40];
  if (NULL == inet_ntop  (AF_INET6, &adres, dst, 40)) {
    perror( "próba zamiany adresu nieudana" );
    return -3;
  }
  printf("%s\n", dst);
}

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



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license
"Copyright (c) 2007, Dominik Jaraczewski, BSD-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/numeracja_ipv6.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).