HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0124
うひょhspsockでグローバルIP12解決


うひょ

リンク

2007/1/24(Wed) 15:25:56|NO.5077

hspsockでグローバルIPを取得したいのですが、方法をしらべたところ
サーバーを建ててそこに接続し、IPアドレスを取得するという方法を見つけたのですが、
これはHSPスクリプトのみで可能でしょうか?それとも、
サーバーサイドプログラムの協力が必要でしょうか?



この記事に返信する


As

リンク

2007/1/24(Wed) 17:07:30|NO.5082

グローバルIPアドレスはプロバイダから渡されるため、
一回インターネットを介さない限り取得することはできません。
なので、どうしてもどこかのサイトに接続しないと取得できません^^;



うひょ

リンク

2007/1/24(Wed) 18:03:32|NO.5085

では、借り物のサーバーでもいいのでしょうか?
そうだとすれば、僕の使っているCGI使用可能のサーバーにCGIスクリプト(Perlで組む予定)
でIPを取得し、それをHSPのスクリプトに返す…ということをしたいのですが、可能
でしょうか?



kanzaki

リンク

2007/1/24(Wed) 20:14:09|NO.5097

HSPとは関係がありませんが

CGIで可能です。
SSIを使用するとさらに簡易に作成できます(SSIを許可していれば)

HTMLに


<!--#echo var="REMOTE_ADDR" -->

と記述すると、その部分がIPアドレスになります。

たとえば
http://kanzaki.dip.jp/ssidocs/test.shtml
または、
http://kanzaki.dip.jp/ssidocs/ipprint_ssi.shtml
のような感じです。

これを取得して、グローバルIPとすれば良いと思います。
ご参考になれば幸いです。



うひょ

リンク

2007/1/24(Wed) 21:05:54|NO.5098

SSIは色々試してみましたがだめでした...。
そこでCGIを使うことにしたのですが、どうすればCGIで作成した文字列等を
HSPのソフトで受信することができますか?
ソケットで受信できると聞いたのですが...。



kanzaki

リンク

2007/1/24(Wed) 21:53:40|NO.5099

もはや、HSPの話ではなくなってしまい
ご不快に思われた方に伏してお詫び申し上げつつ

こういう方法があります。

↓CGIです

#!/perl/bin/perl print "Content-type: text/html\n\n"; print "$ENV{'REMOTE_ADDR'}\n";
ただ、キチンと動作確認できておりませんから
予期しない返答になるかもしれません。

http://kanzaki.dip.jp/cgi/ipgettest.cgi
このような感じです。

HSPの話に戻しましょうか…
先ほどのSSIで作った物を、HSPで使用するサンプル

#include "hspinet.as" netinit netdlname "getip.txt" neturl "http://kanzaki.dip.jp/" netload "/ssidocs/test.shtml" sdim GlobalIp,32 bload "getip.txt",GlobalIp,16,0 mes "なま "+GlobalIp; ←このままだとゴミが残ってしまう。ゴミにはスペースが含まれていたので↓のような方法を取ってみた。 if instr(GlobalIp,0," "):poke GlobalIp,instr(GlobalIp,0," "),0; ←スペースを探して、null(0)に置き換えた。 mes "加工1 "+GlobalIp bload "getip.txt",GlobalIp,16,0; もう一回元の状態にします。 ;代替の処理としては、IPアドレスに使用される文字(数字とドット)以外があればnullに置き換えてループから抜ける方法 repeat if (peek(GlobalIp,cnt) >= 0x30) and (peek(GlobalIp,cnt) <= 0x39) or (peek(GlobalIp,cnt) = 0x2e) :else:poke GlobalIp,cnt,0:break loop mes "加工2 "+GlobalIp ;見た目は問題ないが、この状態でもnull以降にゴミ(改行LF)が存在するため(デバッグウィンドウのメモリダンプで見てください) sdim GlobalIpTemp,32 GlobalIpTemp = GlobalIp ;とする事によってゴミを消去する事が出来る mes "加工3 "+GlobalIpTemp



kanzaki

リンク

2007/1/24(Wed) 22:13:31|NO.5100

補足です。

加工1の方法は、ヒント的なものです。
CGIでやる方法では、ちゃんと動作しないと思います。

あと、
netload "/ssidocs/test.shtml"
は誤りで、正しくは
netload "ssidocs/test.shtml"
ですね… 動作はしますが



うひょ

リンク

2007/1/24(Wed) 22:14:01|NO.5101

>もはや、HSPの話ではなくなってしまい
誤解を招く発言をしてすみません。
僕は、CGIで取得したIPをHSP側で取得する方法を質問したつもりでした。
とりあえずSSIを利用したサンプルを頂いたのでそっちでがんばってみます。
ありがとうございました。
あとはHSPの問題ではないので、解決にして色々試してみます。



93

リンク

2007/1/24(Wed) 22:20:17|NO.5102

なんとなく興味あったので作りました。
モジュールにしたので勝手に使ってください。


#module #include "hspsock.as" #define global urlHTTP "checkip.dyndns.org" // 接続URL #define global fileHTTP "/" // 接続ファイル #define global portHTTP 80 // ポート #define global timeHTTP 1000 // タイムアウト用 #define global sizeHTTP 1024 // パケットサイズ #define global tagHTTP "body" // 読み出し前タグ #define global keywordHTTP "Current IP Address:" // 読み出し前キーワード #defcfunc getIP /*ソケット生成*/ sockopen 0, urlHTTP, portHTTP if (stat != 0) { dialog "接続エラーです", 1, "エラー" : stop } /*パケット送信(GETメソッド)*/ sockput "GET "+fileHTTP+" HTTP/1.0\nHost:???\nUser-Agent:???\n\n" if (stat != 0) { dialog "送信エラーです", 1, "エラー" : stop } /*変数初期化*/ dim flg, 1 dim size, 1 dim p, 1 sdim buf, sizeHTTP, 2 /*取得ループ*/ repeat timeHTTP /*パケット取得部分*/ sockget buf(0), sizeHTTP if (stat != 0) { dialog "('A`)", 1, "エラー" : stop } /*内容確認*/ if (peek(buf(0), 0) == 0) { /*受信終了したなら*/ : flg = 1 break } : buf(1) = buf(1)+buf(0) await 100 loop /*フラグ判定*/ if (flg != 0) { /*受信成功したなら*/ /*パケットのヘッダから*/ : p = instr(buf(1), 0, "\n\n") : buf(1) = strmid(buf(1), p, strlen(buf(1))) : p = instr(buf(1), 0, "<"+tagHTTP+">") : buf(1) = strmid(buf(1), p+strlen(tagHTTP)+2, strlen(buf(1))) : p = instr(buf(1), 0, "</"+tagHTTP+">") : buf(1) = strmid(buf(1), 0, p) : p = instr(buf(1), 0, ""+keywordHTTP+"") : buf(1) = strmid(buf(1), p+strlen(keywordHTTP), strlen(buf(1))) } else { /*受信失敗したなら*/ : buf(1) = "" } return buf(1) #global mes getIP()



93

リンク

2007/1/24(Wed) 22:30:40|NO.5103

あ、ソケット解放忘れてるので取得ループ後に記述お願いします。
というか質問に答えられてるでしょうか?



As

リンク

2007/1/24(Wed) 22:47:07|NO.5105

流石ですね・・(笑)。

ちなみにcheckip.dyndns.orgっていうサイトはダイナミックDNSとか提供しているサイトで、
その際にIP取得とか必要になるので、グローバルIP取得目的専用のページです。
ご自由に使っても構わないと思います。



kanzaki

リンク

2007/1/24(Wed) 22:54:00|NO.5108

>>僕は、CGIで取得したIPをHSP側で取得する方法を質問したつもりでした。

申し訳ないです。
勘違いしておりました。
ちなみに、CGIでもSSIでも、HSP側でやる事は同じです
また、93様のモジュールの方が汎用性が高く秀逸だと思います。


それでは、頑張ってください



うひょ

リンク

2007/1/25(Thu) 17:48:54|NO.5129

>ちなみにcheckip.dyndns.orgっていうサイトはダイナミックDNSとか提供しているサイトで、
そんなものがあるのは知りませんでした。ありがとうございます。今後の参考にします。
93様のモジュールはありがたく使わせて頂きます。ありがとうございます。



ONION software Copyright 1997-2023(c) All rights reserved.