|
> あきらめるのは早いです。 うーん、ごもっとも。恥ずかしながらこういう 方法には全く気づきませんでした。 |
|
68userさん、ご教授ありがとうございました。 gccのオプション調べてみます。 |
|
こんにちは、はぴおです。 68userさんレスありがとうございました。 非常に恥ずかしい話ですが、68userさんのおっしゃる通りです。 何で気が付かなかったんだろうか??? ありがとうございました! HTTP、SMTP、POP3ができたので、今度はFTPをやろうかと 思います。 |
|
お世話になります。 実は今、C言語でCGIの勉強をしているのですけど、 CGIのデバッグってどうやるんでしょうか? もしかして、動作確認はいちいちブラウザで確認するしかないのですか? つ、つらい‥ なにか、効率的なデバッグ方法を知っていらしたら 教えて下さい。お願いします。 |
|
> もしかして、動作確認はいちいちブラウザで確認するしか > ないのですか? まさか :-) CGI というのはインタフェースです。 ブラウザからの情報を、環境変数と標準入力経由で プログラムに引き渡すインタフェース。それが CGI。 だから、 % env REQUEST_METHOD=GET QUERY_STRING='hoge=1&fuga=2' ./foo.cgi とか % set content='number=123&str=%21%22%23' % echo -n $content | env REQUEST_METHOD=POST CONTENT_LENGTH=`echo -n $content|wc -c` ./foo.cgi とかとか、 #ifdef DEBUG #define INPUTFILE_FOR_DEBUG "debug.txt" { char tmp[128]; struct stat sb; setenv("REQUEST_METHOD", "POST", 1); stat(INPUTFILE_FOR_DEBUG, &sb); sprintf(tmp, "%d", sb->st_size); setenv("CONTENT_LENGTH",tmp , 1); freopen(INPUTFILE_FOR_DEBUG, "r", stdin); /* この使い方合ってるっけなぁ… */ } #endif とかとかとか。 |
|
こんにちは。 掲示板のファイルに書きこむ部分で、 「web と CGI のひみつ」の「掲示板を作ろう (2)」の最後にある テンポラリファイルに書き込んでからrenameする方法いいなと思ったのですが、 これだとrenameするときに衝突する可能性ありますよね? http://www.wakusei.ne.jp/twn/wwwlng.cgi?print+200003/00030031.txt ここにあるcheck-lockスクリプト(いつもありがたく使わせていただいてます m(_ _)m ) でやってみようと思うのですが、うまくrename時の衝突を回避する方法があればご教授ください。 |
|
http://x68000.startshop.co.jp/~68user/net/sample/echo-server-1.c このコードのバグを見つけました。 コンパイルして動かすとacceptで失敗するのでこっちの設定が 悪いんだろうと思ってFreeBSD関連のメーリングリストを 検索していたら原因がわかりました。 connected_socket = accept(listening_socket.... の上に len = sizeof( sin ); が必要です。 バグの理由は http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/43141 です。 |
|
はじめまして。 No.1389の指摘のついでですが len = sizeof(peer_sin); は、いらなんじゃないですか? バグの理由でも書かれてるとおり acceptの第3引数は、入出力両用ですので 帰ってきた値をそのまま使うのが正しいと思うのですけど。 |
|
> len = sizeof( sin ); > が必要です。 なるほど、確かに FreeBSD 4.2-BETA で動かすと accept に 失敗していました。これまではたまたま動いていたわけですね。 修正しておきます。ありがとうございます。 > len = sizeof(peer_sin); > は、いらなんじゃないですか? こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 Getpeername() returns the name of the peer connected to socket s. The namelen parameter should be initialized to indicate the amount of space pointed to by name. On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small. > これだとrenameするときに衝突する可能性ありますよね? えっと、あの例では rename は使っていません。あの後 排他処理に ついて書くつもりでしたが、時間がなくて全く手を付けていません。 > うまくrename時の衝突を回避する方法があればご教授ください。 もし rename でやるとしても、それ以前に複数のプロセスが tmp_file へ同時に出力しようとする可能性があるので、あの 部分全体を排他する必要があります。 で、方法ですが、適当なロックファイルを用意して排他処理を 行えばよいです。flock でも symlink でも mkdir でも rename でも 何を使っても構いません。 |
|
返事どうもありがとうです。 > えっと、あの例では rename は使っていません。 よく見てませんでした。申し訳ないです。。 > もし rename でやるとしても、それ以前に複数のプロセスが > tmp_file へ同時に出力しようとする可能性があるので、あの > 部分全体を排他する必要があります。 なるほど。そこで、お教えいただいた通りにちょっと改造してみました。 # 毎回違う名前で作る $tmp_file = 'bbs'.$$.'.tmp'; open(TMP_OUT,"> $tmp_file"); print TMP_OUT "発言者: $from<BR>\n"; print TMP_OUT "$now_date $host<BR>\n"; print TMP_OUT "$message<HR>\n"; open(IN,"$data_file"); while (<IN>){ print TMP_OUT $_; } close(IN); close(TMP_OUT); # tmp_file の内容を $data_file にコピーするだけ #open(TMP_IN,"tmp_file"); #open(OUT,"> $data_file"); #while (<TMP_IN>){ # print OUT $_; #} #close(TMP_IN); #close(OUT); # コピーのかわりに、$data_fileにrename # その前に排他処理。 $lock_file = 'bbs.lock'; touch($lock_file); open(IN,"$lock_file"); flock(IN, 2); rename($tmp_file, $data_file); close(IN); unlink($lock_file); # 必要ない?? これで完璧ですか?? 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 改善点があればご教授くださいませ。 長文すみませんでした。 |
|
>> len = sizeof(peer_sin); >> は、いらなんじゃないですか? >こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 失礼しましたぁ。。勘違いです。 きっちりしたサイズを指定しなくてもよかったんですね。 小さい場合は切り詰めるって仕様も最初は意味不明でしたが、 よく考えると最低でもアドレスファリは所得できそうなので有用ですね♪ |
|
いつもすいません、ふくしです。 LDAP の使い方でこんなことができるかどうかどなたか相談に乗ってください。 Microsoft Exchange Server のアドレス帳で、集団のアドレス (営業部 <markettng@nantoka.org とか)があって、 そこに送るとたくさんのひとに (yamada.tarou@nantoka.org、satou.hanako@nantoka.net、、)に 行くようになっているとき、組織名を渡してこの構成員一覧を返す アプリケーションを作ろうと思っています。 Exchange は LDAP を受け付けるときいたので、 Perl に Net::LDAP をインストールして、 サンプルをいじって使ってみたのですが、 marketting というメール アドレスが「ある」ことはわかるところまで いったのですが、その内容まではわかりません。 ご存じの方がいらっしゃいましたら、よろしくお願いします。 |
|
ちょっと前にHTTPのセパレータの話がありましたが、 どうも最近の携帯の中には、\r\nにしか対応していないものもあるようで、 友人からの「携帯からアクセスできない」との苦情に対応方法がわからず、 「まさか」と思いつつもこれまで\n\nとしてきたセパレータに\r\nを加えてみたところ、 ちゃんと読んでくれるようになりました。 これはうちのサーバの設定の仕方がおかしいんでしょうか。 (普通は\r\nに勝手に変換してくれるものなんですか?) それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 |
|
どうもこんにちは、 Winsock初心者のYOUと申します。 ソフトバンクの、「Winsock2.0プログラミング」という本を 買ってきたのですが、手始めに、サンプルのCH02->Hostinfo をビルドしようとすると、以下のようなエラーが出てしまいました。 プロジェクトへのリンク等には、特に何も指定していません。 どうすれば、解決出来るのでしょうか。 --------------------構成: Win - Win32 Debug-------------------- リンク中... Hostinfo.obj : error LNK2001: 外部シンボル "_WSACleanup@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAStartup@8" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_ntoa@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAGetLastError@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyaddr@12" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyname@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_addr@4" は未解決です LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 link.exe の実行エラー Win.exe - エラー 9、警告 0 よろしくお願いします。 |
|
はじめまして。Elmoです。 telnetでポート80を指定して、”GET”と”Host:”を実行するシェルスクリプト(bash)を作成したいのですが、どうやって、シェルからGETとHost:を実行すればいいのかわかりません。ちなみに、”echo”とパイプを使用してみましたが出来ませんでした。 わかる方、教えて下さい!! |
|
has 殿へ。11/25 (土) に行けたら行きます。仕事次第。 では手短に。 > (普通は\r\nに勝手に変換してくれるものなんですか?) apache だと変換してくれないですね。 > それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 です。でもうちではやってません。いけませんなぁ。 > LDAP の使い方でこんなことができるかどうかど LDAP は勉強しようとしたことはありますが、どうやっても LDAP サーバをあげられず断念しましたので、わかりません。 でも、get_values とかでダメですかねぇ。 > .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 僕は Windows の開発環境を持っていないので、わかる方に おまかせします。 > 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って > どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 試してませんが、心配ならば open(IN,"> $lock_file") と すればいいでしょう。 あと、ロックを開始する場所は open(TMP_OUT,"> $tmp_file"); です。rename の部分だけロックすると、ファイルは壊れませんが 同時に発言しようとしたとき、一方の発言が反映されないです。 それから、失敗する可能性のある場所では、エラーチェックを 必ずしましょう。例えば、OS によってファイルを同時にオープン できる数というのは決まっているので、それを越える open は 失敗します。もし open(IN,"$lock_file"); が失敗したらその後の flock も無意味になり、ロックが働きません。 > telnetでポート80を指定して、”GET”と”Host:”を実行する > シェルスクリプト(bash)を作成したいのですが (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com") | telnet foo.bar.com 80 てな感じで。 |
|
改行が足りてない。 (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com"; echo ) \ | telnet foo.bar.com 80 でした。 |