|
>>1822 みみ > ・クライアントからの接続がある。 > (sd[i]がインクリメントされる。) > ・接続してきたクライアントからの処理要求がある。 > (ここで、クライアント側のプロセスが何なのかが判明する。) > ・getpeername を行うことで、sd[i]の”i”の値を得る。 > (これにより、接続元クライアントのプロセスとを > リンクさせることができる。) うーん、説明が難しいですね。一度わかってしまえば何てことはない のですが…。 クライアントとサーバとの接続点がソケットです。複数のソケットが あるとき、それらを識別するのはソケットディスクリプタ (3 とか 4 などの整数値) です。別のソケットには、必ず別のソケットディスク リプタが割り振られます。 http://X68000.startshop.co.jp/~68user/net/c-echo-2.html で言うと、 for ( i=0 ; i<FD_SETSIZE ; i++ ){ if ( FD_ISSET(i, &target_fds) ){ if ( i == listening_socket ){ accept して、新クライアントのソケットディスクリプタを取得 } else { ソケットディスクリプタ i からデータが送られてきた } } } という感じです。例えば i==5 のとき FD_ISSET が真ならば、 今からやりとりしたいのは「ソケットディスクリプタ 5」です。 このクライアントとの接続が切れない限り、この番号は不変です。 データを読みたいなら read(5, buf, sizeof(buf)) すればよいし、 データを送りたいなら write(5, "hoge", sizeof("hoge")-1) とします。 if ( i == listening_socket ){ accept して、新クライアントのソケットディスクリプタを取得 } else { len = read(5, buf, sizeof(buf)); write(5, buf, len); } とすれば、それで echo サーバのでき上がりです。ソケット ディスクリプタ 5 からデータを読んで、ソケットディスクリプタ 5 にデータを書いているので、echo した結果が別クライアントに 送られることはありません。 つまり、ソケットがいくつあっても「ソケットディスクリプタが 確定している=クライアントが識別できる」と言えます。 getpeername は、相手側の IP アドレスやポート番号を知りたい 場合に使いますが、根本的にはそれらの情報がなくてもどの クライアントとやりとりしているのか区別できます。 |
|
あ、また書き込んでくださったのですね。 重ね重ね、ありがとうございます。 >>1823の内容からすると、 「selectにより、各クライアントを固有のものとして認識できる為、 サーバ側でプログラム的に管理しなくても大丈夫。」 ということなのでしょうか? (うう、一所懸命にプログラム書いちゃいましたけど。) 昨日の書き込み(1822)の内容の処理を行うプログラムは、 意図した通りの動作をしていることは、確認できました。 が。 システムコールに依存した方が信頼性は高いので、 もう一度、見直すことにします。 ありがとうございました。 また、報告に伺います。 |
|
最初のご質問では >>1820 みみ > どのクライアントがどのソケットに接続しているのかを知るのには とありましたので、IP アドレスやポート番号などの情報が 得たいのかと思い getpeername を使えばよいという回答を しましたが、どうやらそうではないのですね。 TCP で、複数のクライアントが接続してきたときに、クライアントを 区別するために、サーバ側で何か処理を行う必要があるか、という 意味ならば、 >>1824 みみ > 「selectにより、各クライアントを固有のものとして認識できる為、 > サーバ側でプログラム的に管理しなくても大丈夫。」 という認識でよろしいかと思います。 |
|
せっかく指摘して頂いたのに返答遅れてすいませんでした。 >>1818 rosegarden 指摘して頂いたとおり、LINTを見ると関係ありそうなものはいかの 通りでした。 # snd: Voxware sound support code # sb: SoundBlaster PCM - SoundBlaster, SB Pro, SB16, ProAudioSpectrum # sbxvi: SoundBlaster 16 # sbmidi: SoundBlaster 16 MIDI interface # pas: ProAudioSpectrum PCM and MIDI # gus: Gravis Ultrasound - Ultrasound, Ultrasound 16, Ultrasound MAX # gusxvi: Gravis Ultrasound 16-bit PCM (do not use) # mss: Microsoft Sound System # css: Crystal Sound System (CSS 423x PnP) # sscape: Ensoniq Soundscape MIDI interface # sscape_mss: Ensoniq Soundscape PCM (requires sscape) # opl: Yamaha OPL-2 and OPL-3 FM - SB, SB Pro, SB 16, ProAudioSpectrum # uart: stand-alone 6850 UART for MIDI # mpu: Roland MPU-401 stand-alone card sbcドライバかguscドライバのいずれかを有効にすればよいとの後指摘でした が、私の使用しているドライバはYamahaのYMF740なので上記のうち 「opl」を有効にするのかなと初心者なりに考えて見たのですが。 >>1817 68user まだ、勉強不足でよくわからないのですが、コンフィグモードというもので 設定すると何らかの設定ファイルが書き変わるのでしょうか? まだ、恐くて試していません。 |
|
>>1826 taka > 指摘して頂いたとおり、LINTを見ると関係ありそうなものはいかの > 通りでした。 > > # snd: Voxware sound support code > # sb: SoundBlaster PCM - SoundBlaster, SB Pro, SB16, ProAudioSpectrum > # sbxvi: SoundBlaster 16 4.2-RELEASE でサウンドを利用する場合 2 通りの方法があります。 (1) pcm ドライバを使う (2) snd ドライバを使う 4.2-RELEASE までなら、snd ドライバが使えます。 で、taka さんが関係ありそうとおっしゃっている opl ドライバは snd ドライバを使う際に使います。 これは pcm ドライバとは一緒に使えません。 (忘れたのですが、指定しても片方が無効になるのだと思いました。) pcm ドライバを使うのなら前の私の書き込みのように sbc ドライバか gusc ドライバあたりを有効にします。 一方, snd ドライバを使うのなら、taka さんの場合なら、 おそらく snd, sb, sbxvi, sbmidi, opl あたりを有効にするのだと 思います。sbxvi あたり存在しないというメッセージが出るかも知れませんが、 そのへんは試行錯誤でやってみてください。 どうしても opl がよさそう、あるいは、簡単そうというのなら、 snd ドライバを有効にして pcm ドライバは使いません。 余談ですが、snd ドライバを使う方法は「FreeBSD 徹底入門」あたりに 書かれている方法ですが、このドライバ自体かなり古いので、 現在では起動時に warning が出ます。 この warning が出ても害はないので心配はいりません。 ところが、snd ドライバは今年に入ってからなくなったと思うので、 4.3-RELEASE からは snd ドライバは使えません。 |
|
>>1827 rosegarden 親切に説明して頂きありがとうございます。 >4.2-RELEASE でサウンドを利用する場合 2 通りの方法があります。 >(1) pcm ドライバを使う >(2) snd ドライバを使う 早速、上記(1)の方法でカーネルの再構築を行ってみました。 以前の書き込みを参考にして # For non-pnp sound cards with no bridge drivers only: device pcm0 at isa? irq 10 drq 1 flags 0x0 # # For PnP/PCI sound cards device pcm を追加し、sbcドライバ、guscドライバを交互に有効にしてみました。 dmesgの関係ありそうなログは前と変わらず、下記の通りでした。 pcm0: <Yamaha DS-1 (YMF740?)> irq 9 at device 10.0 on pci0 pcm0: unable to map register space % cat /dev/sndstat cat: /dev/sndstat: Device not configured どちらのドライバを用いても認識していないみたいでした。 --- ところで、話は変わるのですがやはり初心者にはFreeBSDは敷居が高いものな のでしょうか?Linuxなどは書籍などが豊富で分かりやすく書かれたものが多 い印象を受けます。一方、FreeBSDは書籍も少なく、またある程度の知識を もっていないと私の場合のようにすぐつまづくように感じました。 |
|
>>1828 taka > mesgの関係ありそうなログは前と変わらず、下記の通りでした。 > pcm0: <Yamaha DS-1 (YMF740?)> irq 9 at device 10.0 on pci0 > pcm0: unable to map register space うーん、4.2-RELEASE だとまだ pcm ドライバが完全じゃないからかな? いま出張中で、-current のソースしかてもとに無いし、 cvsweb で時間をかけて調べられる状態でもないので、 はっきりしたことは言えませんが、 ds1.c: $FreeBSD: src/sys/dev/sound/pci/ds1.c,v 1.21 2000/12/25 01:42:13 cg Exp $ となっていますので、snd ドライバを使うしかないのかも知れません。 上の 2000/12/25 という日付は 4.2-RELEASE が出た後の日付ですから。 あと変だなと思う点は port アドレスが認識されていない点です。 >pcm0: <Yamaha DS-1E (YMF744)> port 0xfc8c-0xfc8f,0xfcc0-0xfcff \ >mem 0xfedf8000-0xfedfffff irq 9 at device 9.0 on pci0 ちゃんと認識されている場合、こんな感じになると思うのですが。 私の知っている範囲で言えば、サウンドドライバの設定には問題無いので、 他の設定、例えば PnP BIOS とかノートパソコンなら PCCARD の設定なんかの問題も考えられるように思います。 |
|
>>1829 rosegarden 度々すいません。 >ds1.c: > $FreeBSD: src/sys/dev/sound/pci/ds1.c,v 1.21 2000/12/25 01:42:13 cg Exp $ 確認して見たところ ds1.c : $FreeBSD: src/sys/dev/sound/pci/ds1.c,v 1.8.2.4 2000/10/05 05:12:31 cg Exp $ となっていて、随分古いような気がしました。 そこで、良く分からないのですが単純に「ds1.c」だけ currentから最新のものをダ ウンロードしてカーネルを再構築するという方法でよろしいのでしょうか? いろいろ関連するソースもあると思うので、単純にそのようにしてよいものか 分かりませんが |
|
いつもこのページを参照させていただいております。 今回初めて書きこませていただきます。 Linux上のTrueColorのディスプレイで実験データ表示用の カラー等高線の図を書くXプログラミングの必要に迫られました。 当初は等高値に値するRGBの各256値を配列に入れて、 XlibのXCreateImage()を使って画面表示すればOKと思っておりました。 しかし、どうやらXウインドウにRGBAフォーマットで渡さなければうまく 表示出来ないようで、単色の色をRGB値で設定してもアルファー値の設定 方法がわからないために「砂あらし」画面の様な画面しか表示されません。 (白、黒などはRGB=各0、256、アルファー=0,256とすれば表示できる) 設定を変えて何とかしても良いのでしょうが、RGBAについて理解して おきたいために、RGBAでの表示にこだわりたいと思います。 何らかのX11上のライブラリ、もしくはRGBA規格についてご存じのお方 ご教授お願いいたします。 |
|
>>1830 taka > そこで、良く分からないのですが単純に「ds1.c」だけ currentから最新のものをダ > ウンロードしてカーネルを再構築するという方法でよろしいのでしょうか? > いろいろ関連するソースもあると思うので、単純にそのようにしてよいものか > 分かりませんが いま自宅に戻ったので、ソースを見比べてみたのですが、だいぶ変わっていますね。 このソースの感じをみると ds1.c の入れ換えだけでは無理だと思います。 4.2-RELEASE 相当のソースと最新のソースを比べると激しく変化しています。 結局、カーネルのソース全体を入れ換えねばならず、そうすると今度は 全部の基本コマンドと /etc 以下のファイルの入れ換えが必要になってきます。 あと数日で 4.3-RELEASE が出るので、新しくしたい場合にはそれを 待った方が良いです。急ぐのなら、4.3-BETA というのが ftp://current.jp.FreeBSD.org/pub/FreeBSD/snapshots/i386/4-LATEST/ にあります。マシンが 2 台あるのなら、片方にこのファイルをダウンロードして 目標とするマシンにインストールすることも可能です。これは かなり 4.3-RELEASE に近い物になるはずです。 しかしながら、初心者の方にこれを使うことはお勧めできません。もっと厄介な 問題を抱える可能性があります。 話を原点に戻しましょう。 サウンドを使うという場合には次のことをまず考慮した方が良いと思います。 (1) snd ドライバの使用。 (2) PnP が有効になっているか (3) ノートパソコンだと PCCARD 関係の設定。PCCARD のドライバが 使う irq とサウンド関係はバッティングしがちです。 (4) PnP を止めて、Legacy モードでマシンを起動するようにして、 Windows (同じマシンに入っていれば) の デバイスドライバのところをみて irq とか iomem などを メモして、それをカーネルの設定ファイルに指定して再構築します。 (3) までやってだめなら、FreeBSD-users-jp というメーリングリスト があるのでそれに参加して質問してみた方が私なんかを相手にするよりも良いかも しれません。メーリングリストの購読の案内は http://www.jp.freebsd.org/ml.html#FreeBSD-users-jp にあります。その際には、カーネルの設定ファイル全部と dmesg の出力 「全部」を添付してください。理想的なのは /boot/loader.conf に kernel_options="-v" というのをいれて再起動し dmesg をとってください。より詳細な情報が dmesg でみられます。みる人がみれば、普通の dmesg よりも アドバイスしやすいはずです。 どうも、サウンドの設定には問題がないようなので、 他のものと衝突しているような気がします。この場合に重要なのは ノートパソコンで PCCARD を使っているかどうかです。 あとは普通に質問を書けば良いかと思います。検索をしましたが、YMF740 の 報告は見当たらず、資料さえ全部添付すれば、 そのまま質問をしても怒られるようなことはないと思います。 それで駄目なら、ソースの問題ということになります。 ファイルの入れ換えは本当に最後の手段です。 |
|
>>1832 rosegarden > マシンが 2 台あるのなら、片方にこのファイルをダウンロードして > 目標とするマシンにインストールすることも可能です。これは > かなり 4.3-RELEASE に近い物になるはずです。 補足です。サイズは X 抜きで、200MB 弱です。通常のアナログ回線での ダウンロードだと 17 時間程みてください。専用線なら、30 分程度で すむ場合もあります。ISDN なら 14 時間程度ですむかも知れません。 インストールフロッピィのイメージだけダウンロードして ftp でインストール という手段もありますが、これはもう絶望的に時間がかかります。 やるのなら、別マシンにダウンロードしてから、そのマシンから ftp インストール というのが実際的です。 どちらにしても、初心者の方がするのはきつすぎます。 ともかく、入れ換えを検討する前に出来ることはあると思いますから、 考えてください。 |
|
>>1832 rosegarden 毎回の早い返答ありがとうございます。 >サウンドを使うという場合には次のことをまず考慮した方が良いと思います。 >(1) snd ドライバの使用。 「4.3-RELESEからsndドライバは使用されない」とおっしゃっていたので 将来性を考えて(?)pcmドライバのみ試してみました。 >(2) PnP が有効になっているか BIOSセットアップでプラグ&プレイが有効になっていることを確認しました。 >(3) ノートパソコンだと PCCARD 関係の設定。PCCARD のドライバが > 使う irq とサウンド関係はバッティングしがちです。 デスクトップで、またPCCARDもないのでこれは関係ないかも(?) >(4) PnP を止めて、Legacy モードでマシンを起動するようにして、 > Windows (同じマシンに入っていれば) の > デバイスドライバのところをみて irq とか iomem などを > メモして、それをカーネルの設定ファイルに指定して再構築します。 ハードウェア関係の設定(irq,iomemなど)は、自分の勉強不足のせいもあって よくわからないのが現状です。これから、ハード関係の勉強をして最低限の ことは覚えて行こうと思います。とりあえず、マシンも1台しかないので 雑誌などに4.3-RELEASEが添付されたときにOSを再インストールしてみようと 思います。 初心者の私に丁寧に解説して頂いてどうもありがとうございました。 |
|
>>1831 sakachan > 何らかのX11上のライブラリ、もしくはRGBA規格についてご存じのお方 > ご教授お願いいたします。 少なくとも X11R6.3 では RGBA には対応していないような気がします。 # 根拠は cd /usr/X11R6/include; grep -i rgba *,*/*。 gtk+、Qt、OpenGL あたりにそれらしき関数があったので それを使うか、 あるいはアルファ値を自前で計算することになると思います。 |
|
たまに出てきてアホな質問で住みません。 Perl で質問です。 (1) $path = '/usr/local/nantoka/us/us/file'; の /us/ を /jp/ に変えようと思ったら、 $path = s|/us/|/jp/|g; ではうまくいきません。 $path =~ s|/us/|/jp/| while $path =~ m|/us/|; ではうまくいったのですが、こんなんでいいんでしょうか。 (2) コマンドラインの mkdir -p で中間的なディレクトリをイッキに 作ってくれますが、Perl の mkdir では作ってくれません。 いまは `` でコマンドを呼んでいますが、これもしょうがないでしょうか。 |
|
>>1836 ふくし > $path = s|/us/|/jp/|g; > ではうまくいきません。 = じゃなくて =~ という話でしょうか。 > コマンドラインの mkdir -p で中間的なディレクトリをイッキに > 作ってくれますが、Perl の mkdir では作ってくれません。 perl5 の標準モジュール File::Path にある mkpath がご希望の ものでしょう。使い方は perldoc File::Path をご覧下さい。 |
|
>= じゃなくて =~ という話でしょうか。 あっすいません、これは掲示板の書き違いです。 正しく動かないスクリプトはちゃんと =~ と書いています。 ../us/us/.. の場合、先頭の /us/ を置換したら続きの us/ から 処理するので s///g ではいかない、という話のようです。 File::Path はありがとうございました! |
|
>>1838 ふくし > ../us/us/.. の場合、先頭の /us/ を置換したら続きの us/ から > 処理するので s///g ではいかない、という話のようです であれば、man perlre に \G … Match only where previous m//g left off (works only with /g) とありますので、 $path =~ s|\G/us/|/jp/|g; ではどうでしょうか。 >>1836 ふくし > $path =~ s|/us/|/jp/| while $path =~ m|/us/|; でもいいのですが、定番の書き方としては、 1 while ($path =~ s|/us/|/jp/|); というのがありますね。 |
|
>>1839 68user > $path =~ s|\G/us/|/jp/|g; > ではどうでしょうか。 ありゃ、全然ダメだ。というか、意味が全く逆ですね。 こういうときに使う perl の regexp ってなかったっけなぁ。 |
|
にゃるほど、1 while でがんばります。(ヘンな日本語) ありがとうございました。 もいっこズにのって質問。 stat や split をリストに代入して1番目と5番めと7番目を 使いたい、とかいうとき、ぼくは他のを $dummy というので 受けていますが、たまに -w で、1回しか使ってないけど 書き間違えてませんかと言われます。 これを言われないような /dev/nul みたいな変数ってないんでしょうか。 |
|
>>1834 taka > >(1) snd ドライバの使用。 > 「4.3-RELESEからsndドライバは使用されない」とおっしゃっていたので > 将来性を考えて(?)pcmドライバのみ試してみました。 ええ、出来ればその方が良いのですが、しかし、鳴らないものを使っても いまの taka さんの needs にはあわないだろうということで、 snd ドライバをお勧めしたのです。 しかし、最初は設定ファイルのレベルだと思ったので、 お節介をしたのですが、 まったく役に立たず、時間ばかりとってしまいました。 申し訳ありませんです。 |
|
>>1841 ふくし ($dummy, $dummy, $dummy, $num1, $num2) = (0,1,2,3,4,5); と、一度に複数回 $dummy を使えば used only once: possible typo の warning は抑止できます。あと、 ($num1, $num2, $num3) = (split(/ /))[1,5,7]; という手もありますが、可読性が低下しますね。 本質的には 「1番目と5番めと7番目を使いたい」という 使い方をせずに $foo = $o->getFoo; $bar = $o->getBar; $baz = $o->getBaz; などと書くように努めるべきだと思いますが、全ての場面で それができるわけでもなく、悩ましい限りです。 |
|
はじめまして。 いきなりですが、 >これを言われないような /dev/nul みたいな変数ってないんでしょうか。 (undef, undef, undef, $num1, $num2)=(0,1,2,3,4); こんなのでどうですか? |
|
>>1841 ふくし >>1843 68user >>1844 ふじ つぎのようにすれば文句をいわれませんでした。 #!/usr/bin/perl -w my ($login, $pass, $uid, $gid) = getpwnam('root'); print "$login:(password):$uid:$gid\n"; exit; my をとったものと、較べてください。 ちなみに動作環境は perl 5.00503 ないしは perl 5.6.0 です。 |
|
>>1845 rosegarden この他にも #!/usr/bin/perl -w use vars qw($login $pass $uid $gid); ($login, $pass, $uid, $gid) = getpwnam('root'); print "$login:(password):$uid:$gid\n"; exit; などと、use vars で宣言しておけば文句を言われないようです。 詳しくは、perldoc vars してみてください。 |
|
にゃるほど、 ふじさん> リスト要素にすれば undef を左辺に持っていけるんですね。 undef = 3; だと怒られますけどね。(当たり前) これは言いたいことを強烈に表現できているような気がします。 rosegarden さん> my や use vars を使った方法もいいですね。 この問題がよく出てくるのはファイルの stat を受けるときなんですが、 こういう意味のある変数のときは変数名をつけておいて使わない (そのうち使うかもしれないので) というのが便利なので、使わせていただきます。 みなさんどうもありがとうございました。勉強になるー |
|
いつも拝見しながら勉強させていただいています。 Perlを使ったソケット通信について質問があります。 HTTPSサーバに対してのソケット通信です。 http://X68000.startshop.co.jp/~68user/net/http-2.html にあるように、通常のソケット通信はできたのですが、 相手がHTTPSになるとヘッダの都合か、まったくうまくいきません。 たとえば、 自分のサーバ →POST→ 相手のCGIのあるサーバ(https) ↓ ブラウザ上にデータを表示 ← 相手が出力したデータを取得 このようなイメージです。 通常のHTTPでのソケット通信の場合、出力するヘッダは、 "POST /sample.cgi HTTP/1.0\r\n" "\r\n(空行)" "(POSTで送信するデータ群)" このような感じだと思うのですが、HTTPS相手だと まったく受け付けてくれません・・・。 これってSSLを相手が利用している以上、不可能なことなのでしょうか? 皆様の知識と知恵を貸してください、お願いします。 |
|
>>1848 d-jiro > このような感じだと思うのですが、HTTPS相手だと > まったく受け付けてくれません・・・。 としたいなら、自前で相手サーバのポート 443 (https の ポート番号) に繋げて、自前でデータを暗号化してから ソケットに送り、受け取ったデータは復号化する必要が あります。これを全部やるのはとてもとても面倒なので、 モジュールを使いましょう。 まず、OpenSSL (http://www.openssl.org) をインストール してください。で、 http://www.cpan.org/modules/by-module/Net/ から Crypt-SSLeay モジュールを入れて下さい。これは LWP を 使うことを前提としたもののようです。 あるいは、Crypt-SSLeay モジュールの代わりに Net::SSLeay というモジュールもあり、socket like に使えますが、現在は 保守されていないのかもしれません。 # http://www.cpan.org/modules/by-module/Net/Crypt-SSLeay-0.23.readme # http://www.cpan.org/modules/by-module/Net/Net_SSLeay.pm-1.05.readme なお、どちらも使ったことがないので、上に書いたことは 全て想像です。成功したか失敗したか結果を教えて下さい。 >>1844 ふじ そうか、undef っちゅうのがありましたね…。 >>1846 rosegarden これとは逆に、use vars すると warning が出なくなって 困ったことがあります (そのときは warning を出してほしかった)。 |
|
whoisのプログラムをプログラムソースを探しているのですが、 どちらにあるかご存知ありませんか? できればperlがいいのですが。 よろしくお願いいたします。 |
|
>>1850 whoisおしえてください > whoisのプログラムをプログラムソースを探しているのですが、 perl 版 http://ring.asahi-net.or.jp/pub/lang/perl/CPAN/authors/id/D/DH/DHUDES/ ついでに C言語版 (FreeBSD の whois。最近のは IPv6 化されています) http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/usr.bin/whois/whois.c whois プロトコル http://ring.asahi-net.or.jp/pub/doc/RFC/rfc1834.txt てなところでしょうか。 |