回答編集履歴
2
#if 1 に修正
answer
CHANGED
@@ -106,7 +106,7 @@
|
|
106
106
|
念の為:エラー時、inet_ntop() が返した "80.80.160.160" は、in_addr.s_addr の初期値 0xa0a05050 が変換されたものです。
|
107
107
|
|
108
108
|
この動作確認プログラムは
|
109
|
-
-
|
109
|
+
- #if 1 を #if 0 に変更すれば inet_addr() を使う
|
110
110
|
- char dst[16]; を、たとえば char dst[14]; に変更すれば inet_ntop() がエラーを返すことを確認できる
|
111
111
|
|
112
112
|
さらに、自作の関数をこのテストプログラムから呼べば・・・
|
1
改行、段落など微修正
answer
CHANGED
@@ -11,17 +11,14 @@
|
|
11
11
|
> return( dst );
|
12
12
|
> で、dstにNULLをいれて返しているはずなのですが、うまくいきません
|
13
13
|
|
14
|
-
|
14
|
+
たとえば 'N' == 0x4E == 78 という整数値、即ち** 'N' は N という文字のアスキーコード値**です。
|
15
|
-
では 'NULL' は何か?普通こういう書き方はしないので ``` return 'NULL'; ``` を試してみると
|
16
|
-
'NULL' == 0x4e554c4c == 1314212940 であることを確認できました。
|
17
|
-
'N' == 0x4e, 'U' == 0x55, 'L' == 0x4c なので説明は不要でしょう。
|
15
|
+
では 'NULL' は何か?普通こういう書き方はしないので ``` return 'NULL'; ``` を試してみると 'NULL' == 0x4e554c4c == 1314212940 であることを確認できました。'N' == 0x4e, 'U' == 0x55, 'L' == 0x4c なので説明は不要でしょう。
|
18
16
|
return 'NULL'; は return 0x4e554c4c; であり、ともかく return 0; ではありません。
|
19
17
|
|
20
|
-
なお、'\0' の値も0ですから、return '\0'; と return 0; は結果は同じですが、**'\0' と NULL では表す意味・使うべき場面が違います**。この場合 return '\0'; は誤った使い方なので、バグです。
|
18
|
+
なお、'\0' の値も0ですから、return '\0'; と return 0; は、結果は同じですが、**'\0' と NULL では表す意味・使うべき場面が違います**。この場合 return '\0'; は誤った使い方なので、バグです。
|
21
19
|
|
22
20
|
さて、そもそも質問者には勘違いがあるようです。
|
23
|
-
> inet_ntopの仕様だと、アドレス表記がおかしいというエラーが起きた際は、
|
21
|
+
> inet_ntopの仕様だと、アドレス表記がおかしいというエラーが起きた際は、NULLを返すようにしなければならない
|
24
|
-
NULLを返すようにしなければならない
|
25
22
|
|
26
23
|
それは inet_ntop() ではなく、inet_pton() の仕様・役割だ、ということ。
|
27
24
|
|
@@ -116,15 +113,11 @@
|
|
116
113
|
|
117
114
|
> if (p[1] == 01) ←この判定はヘン。違和感ありまくり
|
118
115
|
|
119
|
-
- この「01」は, "130.01.7.23" の「01」と比較しようとしたのだと思う。
|
116
|
+
- この「01」は, "130.01.7.23" の「01」と比較しようとしたのだと思う。しかし、 01 は(8進数表記であるが)要するに1という値である。つまり、``` if (p[1] == 1) ``` です。
|
120
|
-
しかし、 01 は(8進数表記であるが)要するに1という値である。
|
121
|
-
つまり、``` if (p[1] == 1) ``` です。
|
122
117
|
|
123
|
-
- 重大なのは、この時点の p[1] は数字文字列 "01" ではない事。
|
124
|
-
p[1] は数字文字列 "01" を変換した数値なので、意図と違う判定をしている。
|
118
|
+
- 重大なのは、この時点の p[1] は数字文字列 "01" ではない事。p[1] は数字文字列 "01" を変換した数値なので、意図と違う判定をしている。
|
125
119
|
|
126
|
-
- 対策すべき表記は "130.02.7.23", "130.1.07.23", "130.2.7.00",
|
120
|
+
- 対策すべき表記は "130.02.7.23", "130.1.07.23", "130.2.7.00", "310.1.7.23", "A30.0.7.23" 等々、様々なパターンが考えられるが、これらが全く考慮されていない。
|
127
|
-
"310.1.7.23", "A30.0.7.23" 等々、様々なパターンが考えられるが、これらが全く考慮されていない。
|
128
121
|
|
129
122
|
ただし、自作の inet_pton() で全てのパターンに完璧に対応しようとしてはいけません。今の質問者の力量で無茶すると、最悪、動くプログラムを何も作れなくなります。
|
130
123
|
むしろ、**最初はエラー対策を一切考慮しないプログラムを作る**。正常なアドレス表記を処理できることを確認した後、できることから**少しづつ対応するように修正する**ことをお勧めしたい。たとえば
|