LoginSignup
0
1

More than 5 years have passed since last update.

IP アドレスを変換

Last updated at Posted at 2018-08-21

元ネタ
元ネタ2

IP を int に

static int toInt(int b0, int b1, int b2, int b3){
    int l = b0 << 24;
    l += b1 << 16;
    l += b2 << 8;
    l += b3;
    return l;
}

int を IP に

static void printIPAddress(int i){
    int b0 = (i >> 24) & 0xff;
    int b1 = (i >> 16) & 0xff;
    int b2 = (i >> 8) & 0xff;
    int b3 = i & 0xff;
    System.out.printf("%d.%d.%d.%d%n", b0, b1, b2, b3);
}

サンプルコード

sample.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int
main(int argc, char *argv[])
{
 struct sockaddr_in server;
 int sock;
 char buf[32];
 char *deststr;
 int n;

 if (argc != 2) {
         printf("Usage : %s dest\n", argv[0]);
         return 1;
 }
 deststr = argv[1];

 sock = socket(AF_INET, SOCK_STREAM, 0);

 server.sin_family = AF_INET;
 server.sin_port = htons(12345);

 server.sin_addr.s_addr = inet_addr(deststr);
 if (server.sin_addr.s_addr == 0xffffffff) {
         struct hostent *host;

         host = gethostbyname(deststr);
         if (host == NULL) {
                 return 1;
         }
/*
         server.sin_addr.s_addr =
             *(unsigned int *)host->h_addr_list[0];
*/
         printf("%d\n", *(unsigned int *)host->h_addr_list[0]);
         printf("%d\n", *(unsigned int *)host->h_addr_list[1]);

         int i = 0;
         for(i = 0; i < 2; i++) {
          int ip1 = *(unsigned int *)host->h_addr_list[i];
          int b0 = (ip1 >> 24) & 0xff;
          int b1 = (ip1 >> 16) & 0xff;
          int b2 = (ip1 >> 8) & 0xff;
          int b3 = ip1 & 0xff;
          printf("%d.%d.%d.%d\n", b0, b1, b2, b3);
         }
 }
}

host.conf の multi on の確認に

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1