hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/ランキング登録 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ by araran

ゲーム結果のランキング登録

ゲームの結果などをサーバー上のCGIにPOSTするモジュールを作ってみる。

サーバーを利用した各種アイディアに転用できるよう解説して行く事にしました。

POSTメソッドを使って、それなりにセキュアにやる。
URLエンコードする。日本語にも対応する?
サーバー側のサンプルCGIも作ってみる。

通信について解説すると長くなるのでOSI参照モデルの第4層(トランスポート層)までのTCP、UDPなどの解説は省きます。
第5層(セッション層)からの解説を行ないます。

OSI参照モデルの全体は出典: フリー百科事典『ウィキペディア(Wikipedia)』を参考にしてください。

具体的にはHTTPプロトコルについて解説します。
HTTPプロトコルとは、TCP/IP上での通信プロトコルであり、RFC 2616により定義されています。

具体的な解説

HTTPの説明はそのうち書きます。
まぁ、telnetすると以下の感じなわけです。

% telnet www.xxxx.co.jp 80
Trying xxx.xxx.xxx.xxx ...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
>POST /cgi-bin/hoge.cgi HTTP/1.0\n\n
>Content-type: application/x-www-form-urlencoded
>Content-length: xx
>
>name1=value1&name2=value2


>が入力部分。

#include "hspsock.as"

sdim a,64000

sockopen 0, "www.xxxx.co.jp", 80
sockput "POST /cgi-bin/hoge.cgi HTTP/1.0\n\n", 0
sockput "Content-type: application/x-www-form-urlencoded", 0
sockput "Content-length: 25", 0
sockput "", 0
sockput "name1=value1&name2=value2", 0
sockget a,64000,0

toCRLF a
mes a

sockclose 0
stop
	;URLのエンコード
	strlen i_size,s_URL_RDIR
	s_URL_RDIR_ENC = ""	;エンコード済みリクエスト情報をクリア
	s_add_char = "@"		;1文字追加用文字列
	repeat i_size,0
		peek c_data,s_URL_RDIR,cnt

		;16進表現にパックしなくてもいい文字を抽出
		if ((c_data>=$30)&(c_data<=$39))|((c_data>=$41)&(c_data<=$5a))|((c_data>=$61)&(c_data<=$7a))|((c_data>=$2d)&(c_data<=$2f))|(c_data=$3f)|(c_data=$3d) {
			poke s_add_char,0,c_data
			s_URL_RDIR_ENC+=s_add_char
		} else {
			if (c_data=$20) {
				s_URL_RDIR_ENC+="+"	;空白は+(プラス)に
			} else {
				int x_add_char
				x_add_char=c_data
				str x_add_char,17
				s_URL_RDIR_ENC+="%"+x_add_char  ;16進にエンコード
			}
		}
	loop

サーバー側

#!/usr/bin/perl

require 'getformdata.pl';

print "Content-type: text/html\n";
print "\n";

%formdata = plab::getformdata();

print "input1 : $formdata{'input1'}<br>";
print "input2 : $formdata{'input2'}<br>";

getformdata.pl 
package plab;

sub getformdata
{
	local $rawdata;
	local %formdata;
	local @inputs;
	local($input, $name, $val);

	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'});
	}
	elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
		$rawdata = $ENV{'QUERY_STRING'};
	}

	@inputs = split('&', $rawdata);

	foreach $input (@inputs) {
		($name, $val) = split('=', $input);
		$val =~ tr/+/ /;
		$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
		$formdata{$name} = $val;
	}

	return %formdata;
}  
 
1 ;

http://www.perl-labo.org/

データの保存

http://www.psl.ne.jp/perl/pdojo03.html

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2008-06-26 (木) 01:36:41 (1991d)