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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0831
shLAN、プロキシ環境でのsockopen9解決


sh

リンク

2008/8/31(Sun) 19:58:51|NO.18813

はじめまして。
質問させていただきます。

Webサーバ"http://example.jp"で動いているphpスクリプト"http://example.jp/sample.php"
に、ローカルのHSPプログラムから文字列情報をPOSTしようとしています。
手元のPCは学校のPCで、プロキシサーバを介してwebを使っています。


まずWebサーバに接続するために

sockopen 0,"example.jp",80

とすると、エラーが出て失敗しました。
システム変数statは4でサーバに接続できていないようです。

プロキシを経由する環境に問題があるかと思い、ためしにLAN上のマシンを指定し、

sockopen 0,"(LAN上のマシンのIP)",21
としたらエラーは出ませんでした。

プロキシが問題かと思い、

netproxy "proxy.example.com",8080,1; //学内で使っているプロキシ sockopen 0,"example.jp",80
としたら、システム変数statで4でサーバに接続できませんでした。


問題はプロキシ経由の環境でしょうか?
Web上のサーバと通信するにはどうすればよろしいでしょうか?
まず、問題もあやふやで申し訳ありませんがよろしくお願いいたします。



この記事に返信する


ANTARES

リンク

2008/9/1(Mon) 00:05:34|NO.18826

 sockopenとnetproxyを組み合わせてもダメでしょう。
組み合わせるならsample\hspinetのサンプルとnetproxyです。
docs\hspinet.txtやdocs\hspsock.txtも参照してください。

私もあまり詳しくありませんが、結局、「文字列をPOSTする方法」が
ネックになりそうな気がします。



sh

リンク

2008/9/1(Mon) 03:37:53|NO.18833

>>ANTARES様
ありがとうございます。
sockopenを使うことから離れないといけないようですね。
httpも良くわからないので勉強してみます。


sockopenさえ出来ればPHPにデータをPOSTできるみたいです
http://209.85.175.104/search?q=cache:A8XNqGu1V78J:www.onionsoft.net/hsp/bbs/log/102.html+buf%2B%3D%22POST+/test.php+HTTP&hl=ja&ct=clnk&cd=1&gl=jp



s

リンク

2008/9/1(Mon) 14:26:59|NO.18836

煽るようで申し訳ないですが使い方のところに

> 投稿者名は匿名でかまいませんが、悪戯やSPAM防止のため投稿者のIPアドレスは記録させて頂いています。
> PROXY(代理)サーバー経由の書き込みはご遠慮ください。

とのことなので気をつけてください。
そのような環境=家でできない環境 だと思われますので仕方ないと思いますが;



sh

リンク

2008/9/1(Mon) 19:44:40|NO.18840

プロキシ経由で失礼します。

netheaderを使ってヘッダ情報にPOSTコマンドを書き込めば
課題である「文字列をPOST」を解決できる気がしてきました。

で、このように書いたのです

netinit; netproxy "proxy.example.com",8080,1; //学内で使っているプロキシ netagent "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)"; netheader "";//デフォルトのヘッダを初期化 netheader "(自分で書いたヘッダ)"; neturl "http://example.com/"; netfileinfo info,"sample.php"

しかし、Webサーバ側で確認したところ
netheaderコマンドが機能していないようで、POSTコマンドも送信されていませんでした。
(追加したものが無く、消したはずのものがそのままヘッダとして送られている)


類似の事例が、
http://hsp.tv/play/pforum.php?mode=pastwch&num=2427
http://f17.aaa.livedoor.jp/~takasoft/Programer/HSP3/hspinet.htm
http://blog.livedoor.jp/ryou9403/archives/cat_10010820.html (January 30, 2007の記事)
とあり、

netheaderは使用不可能ということなのでしょうか。
どなたか代替策をご存知ありませんか?

よろしくお願いします。



ANTARES

リンク

2008/9/1(Mon) 22:58:19|NO.18841

wininet.dllを直接呼び出してnetheader命令に相当する
処理をやるとか?



sh

リンク

2008/9/3(Wed) 17:05:41|NO.18940

>>ANTARES様
ありがとうございます。
dllを使えば、細かな処理ができるのですね。勉強してみます。

netagentを使って任意の文字列を送信することは出来たので、
強引に解決しようとしていましたが、考え直して見ます。

それと、最初にやりたかったプロキシ環境でのsockopenは
http://fs-cgi-basic01.freespace.jp/~puma/lng/joyful.cgi?print+200508/05080003.txt
に参考となる情報があったので、ご報告までに。



ANTARES

リンク

2008/9/5(Fri) 05:47:15|NO.19021

 ずいぶん長くなってしまいましたが、できました。
一応、setProxy命令も作りましたが、インターネットオプションで
設定されていれば、たぶん、setProxyを使わなくても動くと思います。

#module "http" #uselib "wininet.dll" #cfunc InternetOpen "InternetOpenA" int,int,int,int,int #cfunc InternetConnect "InternetConnectA" int,int,int,int,int,int,int,int #cfunc HttpOpenRequest "HttpOpenRequestA" int,int,int,int,int,int,int,int #cfunc HttpSendRequest "HttpSendRequestA" int,int,int,int,int #cfunc InternetReadFile "InternetReadFile" int,int,int,int #cfunc HttpQueryInfo "HttpQueryInfoA" int,int,int,int,int #func InternetCloseHandle "InternetCloseHandle" int ;プロクシのセット #deffunc setProxy str s1, str s2 sdim proxy,256 sdim bypass,256 proxy=s1 ;プロクシサーバ bypass=s2 ;プロクシバイパスリスト return ;送信ヘッダとreferrerのセット #deffunc setHeader var v1, str s2 phead=varptr(v1) sdim referrer,256 referrer=s2 pref=varptr(referrer) return ;httpを開く #define INTERNET_OPEN_TYPE_PRECONFIG 0 #define INTERNET_OPEN_TYPE_PROXY 3 #define INTERNET_SERVICE_HTTP 3 #defcfunc openHttp str s1,str s2,int p3 ;引数 ;User Agent sdim agent,256 agent=s1 ;http server sdim server,256 server=s2 ;http port port=p3 ;インターネットを開く if proxy=="" { accessType=INTERNET_OPEN_TYPE_PRECONFIG ;レジストリから設定を取得する pproxy=0 pbypass=0 } else { accessType=INTERNET_OPEN_TYPE_PROXY ;プロクシサーバを使う pproxy=varptr(proxy) if bypass=="" { pbypass=0 } else { pbypass=varptr(bypass) } } hInternet=InternetOpen(varptr(agent),accessType,pproxy,pbypass,0) if hInternet==0 { dialog "インターネットが開けません" return 1 } ;サーバに接続 hConnect=InternetConnect(hInternet,varptr(server),port,0,0,INTERNET_SERVICE_HTTP,0,0) if hConnect==0 { dialog "サーバへの接続に失敗しました" return 1 } return 0 ;http Requestの送信 #define INTERNET_FLAG_NO_COOKIES 0x80000 #define INTERNET_FLAG_NO_UI 512 #define INTERNET_FLAG_PRAGMA_NOCACHE 256 #define INTERNET_FLAG_SECURE 0x800000 #defcfunc httpRequest str s1,var v2,int p3,int p4 ;パス sdim path,256 path=s1 ppath=varptr(path) ;POSTデータ pdpost=0: if v2!="": pdpost=varptr(v2) lpost=strlen(v2) ;0:GET, 1:POST sdim averb,10,2 averb="GET","POST" pverb=varptr(averb.p3) ;SSLフラグ fSsl=0: if p4: fSsl=INTERNET_FLAG_SECURE ;要求を開く flg=INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI; | INTERNET_FLAG_PRAGMA_NOCACHE flg=flg | fSsl hRequest=HttpOpenRequest(hConnect,pverb,ppath,0,pref,0,flg,0) if hRequest==0 { dialog "http requestの作成に失敗しました" return 1 } ;要求送信 if HttpSendRequest(hRequest,phead,-1,pdpost,lpost)==0 { dialog "http requestの送信に失敗しました" return 1 } return 0 ;データの受信 #define HTTP_QUERY_RAW_HEADERS_CRLF 22 #defcfunc httpGet var v1,var v2, int p3, int p4 ;受信ヘッダ phead=varptr(v1) headsize=p3 ;受信バッファ dup buf,v2 bufsize=p4 ;受信 sdim tmp,1024 size=0 len=0 repeat rt=InternetReadFile(hRequest,varptr(tmp),1023,varptr(size)) if rt==0: break if size<1: break poke tmp,size,0 len+=size: if len>=bufsize: break buf+=tmp loop if rt==0 { dialog "データの受信に失敗しました" return 1 } if len>=bufsize { dialog "受信バッファサイズが足りません" return 1 } ;ヘッダの取得 flg=HTTP_QUERY_RAW_HEADERS_CRLF rt=HttpQueryInfo(hRequest,flg,phead,varptr(headsize),varptr(index)) if rt==0 { dialog "受信ヘッダの取得に失敗しました return 1 } if index { dialog "ヘッダがまだあるようです" } return 0 #deffunc closeHttp if hRequest: InternetCloseHandle hRequest if hConnect: InternetCloseHandle hConnect if hInternet: InternetCloseHandle hInternet return #global ;POSTする文字列 - 英数字と一部の記号以外を含む場合、URLエンコードが必要 dpost="test=abc&mode=check" ;http server server="antares.cn" ;http port port=80 path="/test3.php" ;user agent(Browser) agent="Hsp/3.1" ;送信ヘッダ sdim header,1024 header="Accept: text/html;q=0.9,text/plain;q=0.8\n" ;この辺はなくても header+="Connection: close\n" ;動作するようです header+="Content-type: application/x-www-form-urlencoded\n\n" ;リファラ(リンク元) referrer="" ;プロクシ ;proxy="nnn.nnn.nnn.nnn:nnnn" proxy="" bypass="" rheadsize=1024 sdim rhead,rheadsize bufsize=32000 sdim buf, bufsize setProxy proxy,bypass setHeader header,referrer stt=openHttp(agent,server,port) if stt==0: stt=httpRequest(path,dpost,1) if stt==0: stt=httpGet(rhead, buf, rheadsize, bufsize) if stt==0 { if strlen(rhead)+strlen(buf)>=bufsize { dialog "bufのサイズが足りません" stt=1 } else { buf=rhead+buf mesbox buf,640,480 } } closeHttp if stt: end stop
以下を参考にしました。
http://fs-cgi-basic01.freespace.jp/~puma/lng/joyful.cgi?print+log/03020010.txt



sh

リンク

2008/9/5(Fri) 19:15:40|NO.19039

>>ANTARES様

ありがとうございます。

アドバイスだけでなく、詳細なソースまで考えてくださるとは思いませんでした。
参考にさせていただきます。



ANTARES

リンク

2008/9/6(Sat) 20:45:57|NO.19092

shさんの示したリンクが私のモチベーションを上げてくれたので、
shさんの努力の賜と言っていいです。



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