|
せっかくなので、 >>1509 68user のソースを書き直して 「C 言語で echo サーバを作ってみよう (2)」 http://X68000.startshop.co.jp/~68user/net/c-echo-2.html を作ってみました。C言語+select によるタイムアウト機能付き echo サーバです。 # 一応バグは潰したつもり。 あと、これまでご指摘を頂いた >>1389 Yuuki の accept のバグ、 >>1215 UNIX見習い >>1216 68user の LocalAddr のバグを修正しました。お二人に感謝。 |
|
>>1520 rosegarden おろ、/etc/login.conf には passwd_format=md5 で、/etc/auth.conf には crypt_default = md5 des で、libutil で、libcrypt ですか。全然なにが なんだかわかってませんが、手元にソースがないので調べにくい。MFC を待つか…。 # 軟弱なので、うちは今朝の 4-STABLE です。 |
|
>>1522 68user 言葉が足りないようですみません。 4-stable では /etc/login.conf に passwd_format=md5 と明示的に 指定することによって passwd コマンドなどで 使用するハッシュ関数は変更できますが、perl などで使用している crypt(3) などのハッシュ関数はそのまま des だったりします。 解禁以降、大抵の人はそのまま des 入れているでしょうから。 一方、5-current だと /etc/login.conf でのハッシュ関数の 指定は passwd コマンドでは有効になりますが、それとは別に crypt(3) のハッシュ関数を /etc/auth.conf で指定できます。 これはさっき CVSup して確かめましたが、4-stable には反映されていません。 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/lib/libcrypt/crypt.c ソースはここで確かめられます。 CGI で差分も見れます。 > # 軟弱なので、うちは今朝の 4-STABLE です。 いや、あまり関係ないかと思います。去年の暮れに 4-stable が page fault 頻発して 放棄せざるを得ない状態まで追い込まれたことあります。結局 kernel panic 起こしながら、数個ずつ kernel のファイルをコンパイルして、 安定した kernel をインストールし、それで回復させましたが。 同じ時期の 5-current はすごく安定していました。 ハード構成いかんではそういうことも起こり得ます。 |
|
初めまして。 FreeBSD 3.5.1と、それに付属のperlを使っています。 そこでソケットに関するプログラムを組みましたが、ちょっと問題が出てきました。 下記のソースを見てください。 HTTPサーバに接続して、メッセージを受け取り、一定時間何も受信できないと プログラムを終了しようとしています。 (本当は、相手のサーバからコネクションを切られたら終了するようにしたいんです。) サーバと接続されいる状態では、selectは期待した値を戻してくれるのですが、 接続が切断されたあとも、selectの戻り値が 0以外で、いつまでたっても、 ループから抜けられません。 なにか解決方法はないでしょうか? (大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、 バイナリファイルが対象でもうまくいくのでしょうか?) ## ソケットを開いて、ポート80)に繋ぐ。 ## send(SOCK,"GET /index.html HTTP1.0\r\n",0); $rin=''; vec($rin,fileno(SOCK),1)=1; while (1) { $ret = select($rout=$rin,undef,undef,1); if ($ret == 0 ) { last; } #タイムアウト recv(SOCK,$x,1,0); print $x; } |
|
>>1524 みかん ちろっと見た感じでは 1. \r\n が一個足りません。 2. 相手側がコネクションを切断したときも select は 1 を返します。 その際、recv すると1バイトも読めず、0を返しているはずなのに 無視しているので永遠に終わらないのです。 # http://X68000.startshop.co.jp/~68user/net/echo-4.html |
|
>>1523 rosegarden > 言葉が足りないようですみません。 いや、解説を催促するつもりはなかったのですが、恐縮です。 login.conf ということはユーザごとに DES か MD5 を定義 できて、しかも各ユーザは ~/.login_conf で上書き自由、 ということだと思うんですが、それが出来て何がうれしい んだろう…ってのが疑問なんです。 # NIS 使用時に幸せ? > 去年の暮れに 4-stable が page fault 頻発して > 放棄せざるを得ない状態まで追い込まれたことあります。 恐いですねぇ。僕は FreeBSD-stable も流し読みだし、make world で こけたとき直すスキルもないので、ビクビクしながらやってます。 4-STABLE じゃなくて 4.2-RELEASE にしとけばよかったな。 >>1524 みかん > 大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、 > バイナリファイルが対象でもうまくいくのでしょうか? <> は C でいうところの fgets 相当 (+バッファサイズが無限長) なので うまくいきます。 うまくいきますが、改行コードが1つもないデータを読もうとすると 一度に多くのバッファ (=メモリ) を消費するので、 sysread(SOCK, $buf, 8192); read(SOCK, $buf, 8192); while ( read(SOCK, $buf, 8192) ){ print $buf } などの方がよいです。 ついでに言っておくと、状況にもよりますが、select に <> や read を使うのは不適切です。select で読み込み 可能だからといって、「改行コードを含むデータ」や 「指定したサイズのデータ」が読み込めるとは限らない ので (データの前半部分だけが先に到着しているかも しれない) からです。せっかく select でブロッキングを 回避しているのに、<> や read の部分でブロッキング してしまうかもしれない。 # ここでいう read は read(2) でなく perl の read (fread(3)) です。 |