|
ふと思ったのですが、CGIへPOSTメソッドでデータを送信した時に そのCGIでデータを受け無い時(readしない場合)って、そのデータは どうなるのでしょう? CGIで、最近流行りのバッファーオーバーフロー対策?として、POST データサイズを予め調べてから、read で読み込むようにしようと 考えましたが、このような場合は、サーバーOS/ソフト側でバッファ に一旦溜まるのでしょうか? それとも、CGIが受け取らない限りOS/ソフト側でデータそのものを 受け取らないのでしょうか? 試しに自環境にあるApacheに、アップロード機能付きの掲示板CGIを 使って約80Mbを送信してみましたが、cgi-lib.pl のエラー?でCGIは 停止したらしく、ps コマンドを見ると、zonbi となっていたため、 httpdがタイムアウト処理?をして切断された結果(だと思う)、ブラウザに 「cgi-lib.pl: Request to receive toomuch data: 84400432 bytes」と 表示され切断されたように見えました。 そして、その状態まで送信は止まらずにブラウザは送信を続けていました。 top や free で送信中のメモリの状態を観察していても変化がなかった 事から、CGIが受け取らないと捨てられてしまうようにも見えますが、 ちゃんと試験が出来ていたのか、自信が無いので正確な所は不明です。 結局、CGIでPOSTデータを受け取らなくても(プロセスが死んでいた為) ブラウザ自身は送信を続けていたので、どの時点で(OSかApache)データ を破棄しているのかは判断できませんでした。 そもそもCGI側でオーバーフローを気にしなくても良いならば、それでいい のですが、どうも動作が判りません。 #それとも実装依存なのかな? |
|
>>2110 /tk > 余計なような足りないような… 確かに。補足どうもです。 >>2112 moz > 質問するかもしれませんので、そのときは、どうか > よろしくお願いします。 ぜひ回答する側にもまわって下さい :-) >>2113 スナフキン > そのCGIでデータを受け無い時(readしない場合)って、そのデータは > どうなるのでしょう? 実装依存です。TCP 的に言えば、相手側がプロセスが read してくれないと相 手側の OS のバッファにたまります。それがいっぱいになったら書き込み側が ブロックします。つまり print SOCKET "...."; を実行したままずっと止まってしまうということです。 ちゃんと調べたわけではありませんが、一般的にPOST データを全部受け取っ て CGI に渡す web サーバが 多いような印象を受けます。あくまで印象なの で、試したわけではありません。 もし int sock; bind(...); listen(...); sock = accept(...); ... ヘッダ読み込み ... if ( fork() == 0 ){ char *args[]={"/home/user/public_html/cgi-bin/foo.cgi", NULL}; dup2(sock, 0); execvp("cgi", args); } else { int status; wait(&status); } のように、直接ソケットを CGI プロセスの標準入力に渡すような 実装ならば、CGI プロセスが read しないと書き込み側がブロック するわけですね。 apache の実装がどうなっているかわかったら僕にも教えて下さい。 |
|
>>2114 68user なんかいろいろとアレなので、書き直し。 int sock; int pipes[2]; bind(...); listen(...); sock = accept(...); ... ヘッダ読み込み ... pipe(pipes); if ( fork() == 0 ){ char *args[]={"cgi", NULL}; dup2(sock, 0); dup2(pipes[1], 1); execvp("/home/user/public_html/cgi-bin/foo.cgi", args); } else { char buf[256]; int len; int status; while ( len=read(pipes[0], buf, sizeof(buf) ){ write(sock, buf, len); } wait(&status); } ソケットのデータを CGI プロセスの標準入力に渡し、 CGI プロセスの標準出力を受け取り、そのままブラウザに 返す web サーバもどきです。 |
|
こんにちは。又お邪魔させてもらいました(^^;) この前はありがとうございます。うまくできました\(^o^)/ 今回は、Perl/Tkなんですがアドバイスよろしくお願いします。m(__)m リストはこんな感じなんですが・・・ use Tk; $mw = MainWindow->new; $mw->title("gifgraph"); $can = $mw->Canvas(-width=400, |
|
すみません↓ tabで形をそろえようとしたら送信のところにいっちゃってenterおしちゃいました(^^;; ヒヤアセ で、リストは use Tk; $mw = MainWindow->new; $mw->title("gifgraph"); $can = $mw->Canvas(-width=>400, -height=>300) -pack(); for(;;){ $gif = $mw->Photo(-format=>'gif', -file=>"graph.gif"); $can->createImage(200,150,-image=>$gif); $mw->after(4000); } 画像が更新されるのでfor文で何度も画像を読みこませたいんですが、ウィジェットすら開かないんです。for文をはずせば今ある画像が表示されるんですが、なぜなんでしょうか? |
|
>>2117 CCIE Perl/Tk は久しくやってないので忘れてしまいましたが、 $can->createImage(200,150,-image=>$gif); $mw->after(4000, \&change_image); MailLoop; exit; sub change_image { $gif が変わっていたら $can をいじる } じゃないですかね。 |
|
参考にさせていただきました。 少し手を加えてなんとか表示できました。それで、 GDモジュールとGIFgraphモジュールでgifを作って for(;;){ ・・・・・・ } の中に入れたんですが $my_graph=new GIFgraph::lines(); ・・・・・ 見たいな感じでGIFgraphを定義させました。 for文の外にこう言う定義は書いたらいいんですが、このモジュールの仕様?(バグ)で中に入れてどんどん作らないと更新されないんで中に書きました。 でもそうすると何度も定義するのでメモリがどんどん食われていくんです。メモリの制御を除いてもメモリが増えていってました。 前に定義したものが残っているのでそれを破棄するってことはできるんでしょうか? |
|
>>2115 68user そうですか実装依存ですか。それが判っただけでもOKです。 ありがとうございます。 perl側では、あまり意味がないという事になりますかね。 しばらくApache関連の情報も探しましたが、今の所該当する 情報は見つかりません。 わざわざ例題(cですよね?)まで書いてもらいましたが、 よく判りませんでした。m(_ _)m cが解かればソースを見て何とかなるかもしれませんが、 まだ不勉強なので… 何か見つけたら報告します。 >>2105 ふくし >ところで、1.1 をお使いですよね? いえ、B20でした・・・って最近使っていないのがバレバレですが(笑) 自分は、DOS上では面倒な処理をする必要がある場合ぐらいしか 使ってません。普通は本物の環境で作業しています。 Cygwin でシンボリックリンクまで対応している事を知ったのも、 最近です(笑) |
|
すいませんヘルプです。 SUN SPARC ServerUitra5にモデムをつけようとして ttyポートを書き変えたらディスプレイが 見えなくなってしまいました。 モデムから入りエミュレータ−から見るととプロンプトのところに?<クエスチョンマーク>がでてこんな事になってます。 ok の後に ls−a をやって見ました。 ls -a f006cd5c SUNW,UltraSPARC-IIi@0,0 f005f2f8 pci@1f,0 f004cd88 virtual-memory f004c7a8 memory@0,10000000 f002ccf0 aliases f002cc80 options f002cb48 openprom f002cadc chosen f002ca6c packages ok ディスプレイを復活させるためには どうすれば良いのでしょうか? |
|
とっても今さらですが、 >>2119 CCIE > 前に定義したものが残っているのでそれを破棄するってことはできるんでしょうか? 最小限のスクリプトを見せてもらえればわかるかもしれません (し、わからないかもしれません)。 >>2121 木島 透 すいません、わかりませんです。 ところで、また UNIX の部屋のカウンタが壊れているなぁ。 http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/count/countup.pl?rev=HEAD&content-type=text/x-cvsweb-markup で怪しそうなところと言えば、 sub counter_increment { ... myopen(OUT,"> $countdir/count.$ARGV[0]") || exit; print OUT "$num\n"; close(OUT); } ここらへんでブラウザが中断されて SIGPIPE 受けた、くらいしか 思い付かない。 ちなみにこのサーバは行儀の悪いロボットのせいか、しょっちゅう file: table is full となります。この前は apache が落ちた形跡があるし。うーむ。 |
|
みなさん、はじめましてこんばんわ。 IPなど、とっても私にとっては難しい事なのですが、今困っていて、ここを探しました。 実はいつも行くHPの掲示板などに、荒らしがヒドイんです。 管理人さんは、海外にいるとか、何とかで・・・。管理されていないんですよね。元々は、すごく雰囲気がよくて、みんなが楽しめていた掲示板だったんですが・・・。荒らしが多すぎて、無視して、カキコミしてたら、ほんの数時間前にカキコミしたのが、消えてしまっている・・・その位、ひどいんです。 どうにか出来ないものでしょうか?記事の削除などは、管理人さんしか出来ないですよね?でも、管理人さんが管理をしないので・・・。 困ってしまって・・・。そしたら、IPで、拒否できるっていう情報を聞きました。それも、管理人さんじゃないと出来ない方法なのでしょうか? 無知すぎる自分も悪いんですが・・・一日も早く、荒らしがいない掲示板に戻ってほしいと思っています。なにか、いい方法があるかたは、教えていただきたいです。 長々と申し訳ありませんでした。 |
|
>>2123 マイ > 記事の削除などは、管理人さんしか出来ないですよね? そうです。第三者には出来ません。 > IPで、拒否できるっていう情報を聞きました。それも、管理人さん > じゃないと出来ない方法なのでしょうか? これも管理人が特定の IP アドレスを拒否するようにしないと いけません。 結局のところ、現在の掲示板をそのまま生かすなら、 ・管理人にちゃんと管理してくれ、と頼む ・管理人からパスワードを教えてもらうなどして、管理者の権限を譲り受ける (それを許さないようなプロバイダの規約があるかもしれませんので、ご注意あれ) のどちらかしかないでしょう。 IP アドレスの制限については、掲示板の形態がわからないと 何とも言えませんが、CGI プログラムを使っているのならば http://www2s.biglobe.ne.jp/~cru/library/zddbbs/zddbbs0.html が使えると思います。 |
|
みなさまはじめまして。 場違いな質問かもしれないのですが、 皆様ご親切なので質問させていただきます。 ただいま、当方、UNIXCにて、プログラムを作っております。 そこで、telnetやTeraTermを起動した時に ユーザID、パスワードの認証があると思うのですが、 それと同様のことを、Cのプログラムの中で行ないたいのです。 <例> ユーザ名を入力してください → USERA パスワードを入力してください → (キーボードを入力しているが出力されない) このような設定(記述)のしかたをご存知の方いらっしゃいますでしょうか? また、この時に入力されたフィールドをscanfで読み取ることは可能なのでしょうか? もし、ご存知な方がいらっしゃったら教えていただきたいです。 宜しくお願いいたします。 |
|
>>2125 RUB UNIX と言ってもいろいろあるので、ちゃんと環境を書きましょう。 以下、FreeBSD と仮定して説明しますが、Solaris でも同じはずです。 > パスワードを入力してください → (キーボードを入力しているが > 出力されない) http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/gen/getpass.c?rev=1.9 の getpass が参考になるでしょう。 要は、tcgetattr して、ECHO を落として (NOECHO にする)、 tcsetattr することで、tty ドライバの echo back を OFF にできます。より詳しい情報は termios(4) をどうぞ。 もっとお手軽にやりたいなら、 http://X68000.startshop.co.jp/~68user/net/ftp-5.html の stty の部分を読んでください。 |
|
お世話になります。 土田@アグレです。 今、ブラウザの変わりになるCOM++のDLL(つまりTCP/IPのブラウザプログラム) を作成しています。 HTTPサーバがWebLogic5.1なのですが、電文そのものはあっているのに、最初から 「HTTP 1.1 400」のエラーが帰ってきてしまいます。 ソケットのコネクションに問題があるのではと考えているのですが、わかりません。 どなたかお知恵を拝借させていただければ幸いです。 ちなみにコーディングは以下のとおりです。 int AuthSocket::connectAgent(SOCKET sock, long *iPort, long *iRetry, sockaddr *sockAddr) { struct sockaddr_in sockAddrIn; int res, i; memset(&sockAddrIn, 0x00, sizeof(struct sockaddr_in)); sockAddrIn.sin_family=AF_INET; sockAddrIn.sin_addr.s_addr=inet_addr("127.0.0.1"); sockAddrIn.sin_port=htons((unsigned short)*iPort); sockAddr=(struct sockaddr *)&sockAddrIn; res=ECCOM_SUCCESS; for (i=0; i<=*iRetry; i++) { if (SOCKET_ERROR==connect(sock, sockAddr, sizeof(struct sockaddr_in))) { res=ECCOM_FAILURE; } else { res=ECCOM_SUCCESS; break; } } return res; よろしくお願いします。} |
|
>>2127 つちだ > 電文そのものはあっているのに これはどうやって確かめましたか? 具体的に何を送っていますか? 400 Bad Request が返ってくるなら、やはりまずはリクエストを 疑うべきだと思います。 |
|
初めて投稿させていただきます。 突然の質問なのですが、SolarisでGNUを使わずに前日の日付を取得する方法というものはあるのでしょうか? |
|
>>2129 福助 env TZ=JST-15 date がお手軽でしょうか。 |
|
>>2130 68user 違った。env TZ=JST+15 date でした。 |
|
すいません、HTML で質問です。 charset ですが、 西ヨーロッパ語(ISO-8859-1)と 日本語(Shift_JIS 希望)を一枚の Web ページで共存できるでしょうか? 以下の方法はいずれもダメでした。 ・font face でフォント名を指定 ・meta タグを2個書く もしご存知でしたらご教示ください、、。 |
|
>>2132 ふくし http://henika.virtualave.net/untitled.htm みたいのでよければ、 http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref (最後にスラッシュはつけない) を参考に、文字実体参照を使用すれば可能かと思います。 それ以外の方法は、unicodeぐらいでしょうか? |
|
>>2133 Mr. おおっ文字参照、忘れていました。ありがとうございます! (ちなみに IE6 では見えますが、NC4.75 では見れない、、) 結局 charset は仕様上ページ単位で混在させられない、 ということなんでしょうかねー。 |
|
>> 2133 へにかさん 掲示板のウラをついて敬称をつけようとして失敗しました ;;; すいません。 |
|
教えてくんで申し訳ありません。 会社の FreeBSD に telnet していたのですが、 急に ssh を使えということになり、 愛用の TeraTerm に TTSSH を組み込もうとして苦戦中です。 いろんな Web を参考に、したことは以下の通り。 ・TTSSH のバイナリ−を展開して TTERMPRO ディレクトリに入れた ・空のテキストファイルを作って ssh_known_hosts と名づけて TTERMPRO ディレクトリに入れた ・TTSSH.exe を起動し、とりあえず接続しないで環境設定へ ・[Setup]-[SSH] で [SSH Known Hosts] の [Read/Write Files] に ssh_known_hosts をいれて [OK] ・[Setup]-[Save setup] を実行し、普段使っている teraterm.ini を指定 ・teraterm.ini に [SSH] セクションが加わっており、その中に、 KnownHostsFiles=ssh_known_hosts という行があるのを確認 ・同じセクションの Enabled= をなんとなく 1 に ・再び TTSSH.exe を起動 ・[Host] を正しく指定し、[port] を 22 番にし (ssh のポートが 22 番であることは管理者に確認済み) [Service] を SSH にして [OK] をクリック ・メッセージが出る。 SECURITY WARNING There is no entry for the server "正しいサーバー名" in your list of known hosts. The machine you have contacted may be a hostile machine pretending to be the server. If you choose to add this machine to the known hosts list and continue, then you will not receive this warning again. □ Add this machine and its key to the known hosts list」 ・チェックボックスをチェックして [Continue] をクリック ・メッセージが出て終了。 TTSSH The host and its key cannot be added, because no known-hosts file has been specified. Restart Teraterm and specify a read/write known-hosts file in the TTSSH Setup dialog box. All the encryption algorithms that this program and the server both understand have been disabled. To comunicate with this server, you will have to enable some more ciphers in the TTSSH Setup dialog box when you run Teraterm again. This connection will now close. ・再び TTSSH.exe を起動し、接続せず、[Setup]-[SSH] を見ると、 [Read/Write Files] には何も入っていない。 ・ssh_known_hosts のプロパティは「読み込み専用」にはなっていない。 こういう状況です、、。 |
|
もうしわけありませんでした、状況が変化しました。 Windows 2000 Server と Windows 95 OSR 2.1 を使っているのですが、 下の現象は 2000 でのものでした。 95 を使ったら状況が変化しました。 下の現象(ssh_known_hosts が作られず、つくっても認識しない)は置きませんでした。 たぶん Program Files 配下のフォルダのアクセス権の違いだと思います。 Windows 95 で TSSH.exe で入ろうとすると、 またキーをつくるかと言われたのでチェックしたら、 次回からは聞かれなくなり、 TTERMPRO フォルダの下に ssh_known_hosts が自動的にでき、 その中にホスト名と「公開鍵」が入りました。 それはいいのですが、入ろうとすると、RCA 秘密鍵を指定する方法しか選べません。 FreeBSD に Telnet で入って ssh-keygen で identity を作って それを TTERMPRO フォルダにコピーし、指定したのですが、 Authorization Failed になって入れない状態です。 以上とりあえずのご報告でした。 あせって情報が整理されないままにポストしてしまい申し訳ありませんでした。 |
|
ひとりで騒いでてすみません。 だいぶわかりました。 ・ファイルがあるのに「エントリがない」と怒られ、 「追加してくれ」と言ったらさらに怒られて終了する件は、 ssh ログインと同時に同じ Teraterm をもう1個起動しているときと わかりました。(^^; ・TTERMPRO/ssh_known_hosts は、なくても勝手に作ってくれ、 管理者が定めたリモートホストの公開鍵を自動的に取ってきてくれると わかりました。 ・あとは自分用の公開鍵と秘密鍵のセットを何らかの方法で作り、 秘密鍵を TTERMPRO に入れて [Setup]-[SSH Authorization]-[Use RCA Key to login] で 指定し、 公開鍵をリモートホストの ~/.ssh/authorization_keys という名前で保存すればいい、 らしい。 ・うちのリモートホストは RCA 暗号鍵必須らしい。 (ログインするとき Use plain password.. がグレイアウトするので) ということがわかりました。 が、依然ログインできません。 正しいパスフレーズを入力してるはずなのに Authorization に失敗します。 |
|
書き込みは2回目です。 プログラムというよりはアイデアの問題かも知れませんが,どなたか教えて下さい。 プロバイダのサーバ(UNIX)にPerlで書いたプログラムを送ってCGIを動かしています。よろしくお願いします。 質問1: フレームで区切られたhtmlのページからsubmitボタンでCGIに飛びます。 CGIではprint "Location: $str\n\n";を使って別のhtmlページへ飛ぶようにしています。 この時,そのフレーム部分だけが別のhtmlページへ飛びますが, ウィンドウ全体(親ウィンドウ)を別のhtmlページ |
|
すみません,文が途中で切れてしまったので,再投稿させていただきます。 −−−−− 書き込みは2回目です。 プログラムというよりはアイデアの問題かも知れませんが,どなたか教えて下さい。 プロバイダのサーバ(UNIX)にPerlで書いたプログラムを送ってCGIを動かしています。 質問1: フレームで区切られたhtmlのページからsubmitボタンでCGIに飛びます。 CGIではprint "Location: $str\n\n";を使って別のhtmlページへ飛ぶようにしています。 この時,そのフレーム部分だけが別のhtmlページへ飛びますが, ウィンドウ全体(親ウィンドウ)を別のhtmlページへ飛ぶようにできないものでしょうか。 質問2: FORMから入力された文章中の半角カタカナを全角カタカナに変換したいのですが 半角カタカナを(文字化けしないで)半角カタカナとして CGIで受け取る方法はあるでしょうか。 FORMから入力された文章をEUCでconvertする前に文字化けしてしまうので(?), jcodeのh2z_eucを使っても上手くいきません。 |
|
あ,UNIXにもいろいろあるのですね。 ソフトはFreeBSDです。 |