〜 ネットワーク 〜
各種サーバーのログイン/ログアウト (要WININET.DLL)

HSP3からはインターネット上のデータを扱えるようにするHSPInet.DLLが同梱されていますが、
作成した実行ファイルと共にDLLを一緒に配布する必要があるので、
様々な理由により「なんとかDLLナシで実現できないか」と思う人たちの為の参考Tipsです。

今回のTipsはftpopenftpcloseに取って代わるサンプルモジュールの紹介で、
HTTPやFTPサーバのほか、Gopherサーバーにログインするものです。
Gopher(ゴファー/ゴーファー)とはアメリカのミネソタ大学内で情報提供の為に開発されたシステムで、
テキストのみしか扱えませんでしたが、1990年代前半までは幅広く利用されていました。
しかし、その後に登場した画像表示やハイパーリンクが使えるWWWの登場により、一気に衰退しました。
コレは今回のTips作成にあたり初めて自分が知った情報です…という余談はおいておいて、
各種プロトコルを通してサーバーと通信するためには、まず接続する必要があります。
接続にはWinInet.DLLのAPI関数InternetConnectを使いましょう。

InternetConnectに指定する引数は第1引数から順番に、「インターネットハンドル」
「ホスト・IPアドレスを入れた変数ポインタ」「TCP/IPポート」「ユーザー名」「パスワード」
「サービスタイプ」「オプション」「コールバック関数に渡すアプリケーション定義値」です。
インターネットハンドルはコチラのインターネットサービス開始時に取得したハンドルを、
ホスト・IPアドレスは接続先ホストのホストアドレスまたは「xxx.xxx.xxx.xxx」表記のIPアドレスを、
TCP/IPポートはポート番号または下記の既定ポートを、
INTERNET_INVALID_PORT_NUMBER0x0000後述のサービスタイプで特定されるサービス既定のポート
INTERNET_DEFAULT_FTP_PORT0x0015RFC既定のFTPポート
INTERNET_DEFAULT_GOPHER_PORT0x0046RFC既定のGopherポート
INTERNET_DEFAULT_HTTP_PORT0x0050RFC既定のHTTPポート
INTERNET_DEFAULT_HTTPS_PORT0x01BBRFC既定のHTTPSポート
INTERNET_DEFAULT_SOCKS_PORT0x0438SOCKSファイアーウォールサーバー既定のポート
ユーザー名は接続時のユーザー名(NULL時はHTTP以外デフォルト(FTPならanonymous))を、 パスワードは接続時のパスワード(ユーザー名共にNULLでかつFTPの場合はEメールアドレスになる)を、 サービスタイプは下記のタイプのいずれかを、
INTERNET_SERVICE_FTP0x0001FTPを利用
INTERNET_SERVICE_GOPHER0x0002Gopherを利用
INTERNET_SERVICE_HTTP0x0003HTTP/HTTPSを利用
オプションは1つしかないようですが、FTP以外では0を、 FTP利用時にパッシブモードで行う(接続後にクライアントからサーバーへ接続要求する)には下記フラグを、
INTERNET_FLAG_PASSIVE0x08000000パッシブモードで接続
コールバック関数に渡すアプリケーション定義値は0を指定しましょう。 無事にサーバーと接続できると、確立された接続を識別するセッションハンドルが返ります。 通信が終了すれば、InternetCloseHandleで上記ハンドルを指定して終了させてください。 サンプルモジュールでは、プログラム終了時に自動的に呼び出される作りとなっているので、 明示的に終了処理を記述する手続きは必要ありません。

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

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

inetlogin サーバー, ユーザー情報, サービス, オプション
サーバーホストサーバーアドレスまたはIPアドレス文字列を指定する。
ユーザー情報ログインユーザー名とパスワードをコロンで区切った形式で指定する。
サービス接続するサービス(1:FTP 2:Gopher 3:HTTP)を指定する。
尚、省略すればFTP接続を行う。
ポート使用するTCP/IPポートを数値指定する。
オプションFTPでパッシブモード利用する時、HTTPでHTTPS通信する時は1を指定する。
それ以外の時は0または省略する。

inetlogout
[パラメータなし]サーバーとの接続を解除するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

 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
	ll_libload wininet, "wininet.dll"
	ll_getproc InternetOpen, "InternetOpenA", wininet
	ll_getproc InternetCloseHandle, "InternetCloseHandle", wininet
	ll_getproc InternetConnect, "InternetConnectA", 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 inetlogin str, str, int, int
	mref server, 32 : mref info, 33 : mref service, 2 : mref option, 3
	mref stt, 64
	instr i, info, ":"
	strlen i.1, info
	strmid user, info, , i
	strmid pass, info, i + 1, i.1 - i - 1
	if hinet = 0 : inetinit
	if user = "" : i.0 = 0 : else : ll_getptr user : ll_ret i.0
	if pass = "" : i.1 = 0 : else : ll_getptr pass : ll_ret i.1
	switch service
	case 2:  i.2 = 0x0002, 0 : swbreak
	case 3:  i.2 = 0x0003, 0 : swbreak
	default: i.2 = 0x0001, option ! 0 * 0x08000000
	swend
	ll_getptr server : ll_ret i.5
	prm = hinet, i.5, 0, i.0, i.1, i.2, i.3, 0
	ll_callfunc prm, 8, InternetConnect@
	ll_ret hsess : stt = hsess
	return

#deffunc inetlogout onexit
	if hsess : ll_callfunc hsess, 1, InternetCloseHandle@
	return	
#global

	sdim v, 128, 3
	pos  10, 10 : mes "FTPサーバー"
	pos 150, 10 : input v.0, 150, 20
	pos  10, 40 : mes "ユーザー名"
	pos 150, 40 : input v.1, 150, 20
	pos  10, 70 : mes "パスワード"
	pos 150, 70 : input v.2, 150, 20
	pos 150, 99 : button "接続", *connect
	stop

*connect
	inetlogin v, v.1 + ":" + v.2
	if stat {
		dialog "接続しました"
	} else {
		dialog "接続に失敗しました"
	}
	stop

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

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

inetlogin サーバー, ユーザー, パスワード, サービス, オプション
サーバーホストサーバーアドレスまたはIPアドレス文字列を指定する。
ユーザーログインユーザー名を指定する。
パスワードログインパスワードを指定する。
サービス接続するサービス(1:FTP 2:Gopher 3:HTTP)を指定する。
尚、省略すればFTP接続を行う。
オプションFTPでパッシブモード利用する時、HTTPでHTTPS通信する時は1を指定する。
それ以外の時は0または省略する。

inetlogout
[パラメータなし]サーバーとの接続を解除するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

 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"
#cfunc	global InternetOpen "InternetOpenA" sptr, int, int, int, int
#func	global InternetCloseHandle "InternetCloseHandle" int
#cfunc	global InternetConnect "InternetConnectA" int, sptr, int, int, int, int, int, int

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

#deffunc inetend onexit
	if hinet : InternetCloseHandle hinet
	return

#deffunc inetlogin str server, str user, str pass, int service, int option, local i, local s
	if hinet = 0 : inetinit
	s = user, pass
	if user = "" : i.0 = 0 : else : i.0 = varptr(s.0)
	if pass = "" : i.1 = 0 : else : i.1 = varptr(s.1)
	switch service
	case 2:  i.2 = 0x0002, 0 : swbreak
	case 3:  i.2 = 0x0003, 0 : swbreak
	default: i.2 = 0x0001, (option ! 0) * 0x08000000
	swend
	hsess = InternetConnect(hinet, server, , i.0, i.1, i.2, i.3)
	return hsess

#deffunc inetlogout onexit
	if hsess : InternetCloseHandle hsess
	return
#global

	sdim v, 128, 3
	pos  10, 10 : mes "FTPサーバー"
	pos 150, 10 : input v.0, 150, 20
	pos  10, 40 : mes "ユーザー名"
	pos 150, 40 : input v.1, 150, 20
	pos  10, 70 : mes "パスワード"
	pos 150, 70 : input v.2, 150, 20
	pos 150, 99 : button gosub "接続", *connect
	stop

*connect
	inetlogin v, v.1, v.2
	if stat {
		dialog "接続しました"
	} else {
		dialog "接続に失敗しました"
	}
	return