〜 ネットワーク 〜
グローバルIPアドレスを取得 (要WININET.DLL)

ローカルアドレスが割り当てられているマシンで取得できるIPは、コチラで紹介したTipsを使っても
インターネット上からそのマシンにアクセスできるグローバルIPアドレスではなく、
イントラネット上のプライベートIPアドレスしか取得できません。
グローバルIPは ユニバーサルプラグ&プレイ(UPnP)対応のルーターから取得する方法がありますが、
皆が皆持っているわけではありませんので利用環境がかなり限定されてしまいます。
他に、HTTPサーバーを立てて、クライアントのIPアドレスを返す処理を組むのも1つの方法ですが、
そのためだけにサーバーを構築するのも如何なものか?
他の方法としては上記と似たようなもので、誰かが公開してるIPアドレスを返すサーバーにアクセスして、
クライアントである自分のマシンのIPを取得すると言うものが考えられます。
コレならば、取得側としてはアクセスするだけでコストは掛かりません。
ただし、個人のサーバーであるが故、24時間いつでも好きな時にアクセスできるとも限らず、
次回アクセスした時にアドレスが変わってしまっていたり、そもそも公開を中断してしまう可能性もあります。
なので、できるだけアドレスが変更されたりサーバーの公開自体が中止になる可能性が低い
大手企業や老舗のサーバーからグローバルIPを取得させていただきましょう。
そして、ページ内の情報からアドレスを抽出する形になるので、
できるだけページ内にアドレス以外の無駄な情報が入ってない所の方が良いですね。
下記のサンプルでは診断くんを公開しているtaruo.netを利用させていただいています。
サービスの提供に関し、この場で御礼申し上げます。ありがとうございました。
他にも無料で公開している所があるのでお好きなところを自己責任の上、利用させてもらってください。
	

inetinit
[パラメータなし]インターネットサービスを開始するだけである為、パラメータは必要ない。

inetend
[パラメータなし]インターネットハンドルを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetget 受取変数, URL
受取変数取得したデータの受取先変数を指定する。
尚、statには受け取ったデータサイズが返る。
URL取得するデータのアドレスを指定する。

inetgetsize URL
URL取得するデータのアドレスを指定する。
尚、statには受け取ったデータサイズが返る。

getgip URL, 開始前ワード, 終了コード
URLグローバルIPアドレスの入ったURLを指定する。
尚、取得したグローバルIPアドレスはシステム変数refstrに返る。
開始前ワードデータ内のグローバルIPアドレス直前ワードを指定する。
終了コードデータ内のグローバルIPアドレス直前直後の区切りコードを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
	ll_libload wininet, "wininet.dll"
	ll_getproc HttpQueryInfo "HttpQueryInfoA", wininet
	ll_getproc InternetCloseHandle, "InternetCloseHandle", wininet
	ll_getproc InternetOpen, "InternetOpenA", wininet
	ll_getproc InternetOpenUrl, "InternetOpenUrlA", wininet
	ll_getproc InternetQueryDataAvailable, "InternetQueryDataAvailable", wininet
	ll_getproc InternetReadFile, "InternetReadFile", wininet

#module
#deffunc inetinit
	mref stt, 64
	prm = 0, 0, 0, 0, 0
	agent = "hspbc"
	ll_getptr agent : ll_ret prm
	ll_callfunc prm, 5, InternetOpen@
	ll_ret hinet : stt = hinet
	return

#deffunc inetend onexit
	if hinet : ll_callfunc hinet, 1, InternetCloseHandle@
	return

#deffunc inetget val, str
	mref data, 24 : mref url, 33
	prm = hinet, 0, 0, 0, 0x80000000, 0
	ll_getptr url : ll_ret prm.1
	ll_callfunc prm, 6, InternetOpenUrl@
	ll_ret hfile
	ll_getptr i : ll_ret i.1
	prm = hfile,i.1
	ll_callfunc prm, 2, InternetQueryDataAvailable@
	ll_ret i
	if i = 0 : return
	sdim s, i.1
	i = 0
	prm = hfile, 0, i.1
	ll_getptr s : ll_ret prm.1
	ll_getptr i.2 : ll_ret prm.3
	repeat
		ll_callfunc prm, 4, InternetReadFile@
		if i.2 = 0 : break
		repeat i.2
			peek i.3, s, cnt
			poke data, i + cnt, i.3
		loop
		i += i.2
	loop
	ll_callfunc hfile, 1, InternetCloseHandle@
	return

#deffunc inetgetsize str
	mref url, 32
	mref stt, 64
	prm = hinet, 0, 0, 0, 0x80000000, 0
	ll_getptr url : ll_ret prm.1
	ll_callfunc prm, 6, InternetOpenUrl@
	ll_ret hfile
	i.1 = 4
	prm = hfile, 0x20000005, 0, 0, 0 // HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER
	ll_getptr i.0 : ll_ret prm.2
	ll_getptr i.1 : ll_ret prm.3
	ll_callfunc prm, 5, HttpQueryInfo@
	ll_callfunc hfile, 1, InternetCloseHandle@
	stt = i
	return

#deffunc getgip str, str, int
	mref url, 32 : mref keyword, 33 : mref fincode, 2
	mref rstr, 65
	inetinit
	inetgetsize url
	sdim s, stat + 1
	key = keyword
	inetget s, url
	instr i, s, key
	if i = -1 : return "取得失敗"
	strlen i.1, key
	getstr rstr, s, i + i.1, fincode
	return
#global

	getgip "http://taruo.net/ip/", "REMOTE_ADDR=", 10
	mes "グローバルIP=" + refstr
	stop

inetinit
[パラメータなし]インターネットサービスを開始するだけである為、パラメータは必要ない。

inetend
[パラメータなし]インターネットハンドルを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

inetget 受取変数, URL
受取変数取得したデータの受取先変数を指定する。
尚、statには受け取ったデータサイズが返る。
URL取得するデータのアドレスを指定する。

サイズ = inetgetsize(URL)
サイズ取得したデータサイズの受取先を指定する。
URL取得するデータのアドレスを指定する。

IP = getgip(URL, 開始前ワード, 終了コード)
IP取得したグローバルIPアドレスの受取先を指定する。
URLグローバルIPアドレスの入ったURLを指定する。
開始前ワードデータ内のグローバルIPアドレス直前ワードを指定する。
終了コードデータ内のグローバルIPアドレス直前直後の区切りコードを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#uselib "wininet.dll"
#func	global HttpQueryInfo "HttpQueryInfoA" int, int, var, var, int
#func	global InternetCloseHandle "InternetCloseHandle" int
#cfunc	global InternetOpen "InternetOpenA" sptr, int, int, int, int
#cfunc	global InternetOpenUrl "InternetOpenUrlA" int, str, int, int, int, int
#cfunc	global InternetQueryDataAvailable "InternetQueryDataAvailable" int, var, int, int
#func	global InternetReadFile "InternetReadFile" int, var, int, var

#module
#deffunc inetinit
	hinet = InternetOpen("hspbc")
	return hinet

#deffunc inetend onexit
	if hsess : InternetCloseHandle hsess
	if hinet : InternetCloseHandle hinet
	return

#deffunc inetget var data, str url, local i, local s
	if hinet = 0 : inetinit
	hfile = InternetOpenUrl(hinet, url, , , 0x80000000, 0)
	if InternetQueryDataAvailable(hfile, i.1) = 0 : return 0
	sdim s, i.1 + 1
	repeat
		InternetReadFile hfile, s, i.1, i.2
		if i.2 = 0 : break
		repeat i.2 : poke data, i + cnt, peek(s, cnt) : loop
		i += i.2
	loop
	InternetCloseHandle hfile
	return i

#defcfunc inetgetsize str url, local i
	if hinet = 0 : inetinit
	hfile = InternetOpenUrl(hinet, url, , , 0x80000000, 0)
	i.1 = 4
	HttpQueryInfo hfile, 0x20000005, i, i.1
	InternetCloseHandle hfile
	return i

#defcfunc getgip str url, str keyword, int fincode, local i, local s, local rstr
	sdim s, inetgetsize(url) + 1
	inetget s, url
	i = instr(s, , keyword)
	if i = -1 : return "取得失敗"
	getstr rstr, s, i + strlen(keyword), fincode
	return rstr
#global

	mes "グローバルIP=" + getgip("http://taruo.net/ip/", "REMOTE_ADDR=", 10)