2019年12月1日日曜日

c inet_addr()ついて



/*
*inet_addr*


*******************************************************
IBM Knowledge Center
https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.b

バークレー・ソケット:
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

unsigned long inet_addr(char *cp);

機能説明
inet_addr() 関数は、標準の小数点付き 10 進数表記で表されたホスト・アド
レスの文字ストリングを変換し、IP アドレスとして使用できるホスト・アド
レスを戻します。

cp
標準のドット 10 進 (.) 表記の文字ストリング

戻り値
正常に実行された場合、inet_addr() は、ネットワーク・バイト・オーダーの
IP アドレスを戻します。
入力文字ストリングの形式が正しくない場合、値 INADDR_NONE が 戻され、
errno は EINVAL に設定されます。
*******************************************************


*******************************************************
以下のようなコードがよく見られる
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //uint32_t型


暗黙の型変換(キャスト)が行われている。
 (1)代入時の変換
 左辺の型と右辺の型が異なっている場合は、左辺の型に変換します。
inet_addr            は unsigned long
addr.sin_addr.s_addr は uint32_t 

するとlongで64ビットのpcではどうなる?
元々
127.0.0.1 は32ビット (下の カゴヤのサーバー研究室 参照)
なので問題なし。以下の暗黙のキャストされて数値が変わる心配はいらない

初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/detail/TypeConversion.html
b)符号無し整数型A ⇒ 符号無し整数型B
    Aの型サイズ ≦ Bの型サイズ : 値は不変
    Aの型サイズ > Bの型サイズ : A % (Bの型の表現しうる最大値+1)
*******************************************************


*******************************************************
カゴヤのサーバー研究室
https://www.kagoya.jp/howto/network/ipaddress/

IPアドレスは数字の羅列です。現状普及しているIPv4というバージョンでは、
32ビット(桁)の2進数ですが、そのままではわかりづらいため、8ビット毎に
「.(ドット)」で区切り10進数表記で表します。それぞれの値は0~255まで
あります。
172.16.254.1   IPv4アドレス(ドットつき10進法)
10101100.00010000.11111110.00000001   32ビット
*******************************************************


*******************************************************
筑波大学 システム情報工学研究科
http://www.coins.tsukuba.ac.jp/~syspro/2008/No6.html
IPアドレスの表記(IPv4)
    32ビットのアドレスを 8 ビットずつに 4 つ分ける
    各8ビットを、10進数(0~255)で表す。
    4つの10進数を、「.」で区切りつなげる
例:
    12.34.56.78
これは、10進数でいくつになるかを計算したい時には、次のようにして計算
する。
    12 * 256^3 + 34 * 256^2 + 56 * 256^1 + 78 * 256^0
*******************************************************


*******************************************************
基本情報技術者講座
http://www.it-license.com/cardinal_number/ToDecimal.html
例題2 8進数の1427.654を10進数に変換する

8進数のそれぞれのけたの重み付けをおこない、各けたの重みをかけたものの 合計を求
基本情報技術者講座 8進数の1427.654を10進数に変換する

1×8^3+4×8^2+2×8^1+7×8^0+6×8^-1+5×8^-2+4×8^-3
=512+256+16+7+0.75+0.078125+0.0078125
=791.8359375

8進数の1427.654は、10進数の791.8359375である。
*******************************************************


*******************************************************
上から推理すると129.0.0.1のIPアドレスは256進数のドット表示で
(255は0xFf 0b11111111)
10進数になおすと
129*256^3 + 0*256^2 + 0*256^1 + 1*256^0
=129*256^3 + 1
=2164260865
=ox81000001
*******************************************************
*/

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

#include <inttypes.h>

int main(){
    char ip[] = "129.0.0.1";//16進数に直すと0x81000001
    unsigned long addr = inet_addr(ip);
    printf("%lu\n", addr);  //16777345   10進数表示
                            //0x1000081  16進数表示
}
//inet_addr()はネットバイトオーダーに変換する役目もある。
//0x81000001がネットワークバイトオーダに変換される。
//つまり2バイトずつ下位から取り出される。
//で 0x1000081 となる


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts