68user's page 掲示板

Prev< No. 1816〜1824> Next  [最新発言に戻る] [過去ログ一覧]
No. 1816 # taka 2001/03/13 (火) 23:30:24
FreeBSD4.2R をインストールしたのですが、サウンドの設定がよくわからずつ
まずいてしまいました。いろいろHPや書籍を調べて以下のような処理を行いま
したが、以前としてサウンドが鳴りません。設定で間違っている箇所が
あれば指摘して頂きたいです。ちなみに、サウンドカードはYamahaのYMF740です。

1. カーネルの再構築
      # cd /usr/src/sys/i386/conf/
      # cp GENERIC MY_KERNEL
      # vi MY_KERNEL
          -------------------------
          以下の内容を追加
          # For PnP/PCI sound cards
          device pcm
          -------------------------
      # config MY_KERNEL
      # cd ../../compile/MY_KERNEL
      # make depend
      # make install

2. デバイスファイルの作成
      # cd /dev
      # ./MAKEDEV snd0

以下は関係ありそうなエラーログです。
> dmesg | grep pcm
pcm0: <Yamaha DS-1 (YMF740?)> irq 9 at device 10.0 on pci0
pcm0: unable to map register space
device_probe_and_attach: pcm0 attach returned 6

> cat /dev/sndstat
cat: /dev/sndstat: Device not configured

No. 1817 # 68user 2001/03/14 (水) 00:29:16
>>1816 taka
> FreeBSD4.2R をインストールしたのですが、サウンドの設定が
> よくわからずつまずいてしまいました。
えっと、サウンド・PnP まわりはいまだに何がなにやらわかりません。
うちでは device pcm を追加し、OS ブート時に boot -cv でコンフィグ
モードにして
    > pnp 1 0 bios enable irq0 5 drq0 1 port0 0x220 port1 0x0 port2 0x388
と設定しました。

なんで IRQ が 5 なのか、なんで PnP なのに手動で設定しないと
いけないのかさっぱりわかりません。pnpinfo(8) の出力も全く理解
できないし…。

僕は、IRQ って ISA のみにしかない概念? PCI のサウンドカードって
あるの? …てな知識レベルなので、FreeBSD-users-jp などで質問された
方が早いかもしれません。

どこかにわかりやすい解説はないかなぁ。

No. 1818 # rosegarden 2001/03/14 (水) 01:32:44
>>1816 taka
私の場合次のようになっています。もっとも 4.3-BETA ですが、
要領は同じだと思います。

# 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

# The bridge drivers for sound cards. These can be seperately configured
# for providing services to the likes of new-midi (not in the tree yet).
# When used with 'device pcm' they also provide pcm sound services.
#
# sbc: Creative SoundBlaster ISA PnP/non-PnP
# Supports ESS and Avance ISA chips as well.
# gusc: Gravis UltraSound ISA PnP/non-PnP
# csa: Crystal Semiconductor CS461x/428x PCI

# For non-PnP cards:
device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15
#device gusc0 at isa? port 0x220 irq 5 drq 1 flags 0x13

sbc ドライバか gusc ドライバのいずれかを有効にしてみてください。
このへんは試行錯誤がいるかもしれません。
LINT から関係する部分を copy&paste してきて
自分に関係ない部分をコメントアウトすると面倒ないです。

No. 1819 # Donchan 2001/03/14 (水) 07:49:45
>>1812 通行人
パスの先頭に/opt/SUNWspro/bin/を追加することで正常に動作しました。互換性の問題だったのね……。

No. 1820 # みみ 2001/03/14 (水) 11:56:04
いきなりの質問でごめんなさい。
こちらの掲示板にはかなり詳しい方がいらっしゃるようなので、
教えて頂きたいのです。

今、UNIX上で動くクライアントサーバをC言語で作っています。
(ほとんど経験がないので、勉強しながらという感じです。)
ちょうど、こちらに参考になるサンプルがあったので、それを元に
作っているところです。
自分の環境で、クライアントとサーバ間のソケット通信をすることが
できることを確認したところです。

ここからが良くわからないところなのですが、
クライアントが複数あって、それぞれが別の処理を行う時、
サーバ側としては、そのクライアントをどう区別したら良いのでしょうか?
selectを使って、任意のソケットに対して任意のデータを送信することは
わかるのですが、では、任意のクライアントプロセスを区別するのは
どうすれば良いのかが、いまひとつ、ぴんとこないのです。
たとえば、サーバ側の処理として、
クライアントA:サーバに「aaa」→「AAA」と変換してecho。
クライアントB:サーバに「bbb」→「BBBBB」と変換してecho。
クライアントC:サーバに「ccc」→「C」と変換してecho。
というのがあるとします。
各クライアントが順不同のタイミングで接続してきた場合、
どのクライアントがどのソケットに接続しているのかを知るのには、
どのような方法があるのでしょうか?
ついでですが、クライアントは、おなじ内容のものが複数接続してくる
場合もあります。(AとA'とA''、みたいに。)

つまり、ソケットディスクリプタのID(と言って良いのでしょうか?
よく、 sd[0]とかsd[i]とかと書かれているものです。)と
クライアントをどうリンクさせれば良いのかがわからない、んです。
C言語で処理するレベルでの話だろうとは思うのですが、
具体的なサンプルがなくて、方法を理解することもできず、困っています。
どうぞ、知恵をお貸しください。
いきなり現れて勝手なお願いをしていますが、よろしくお願いします。

No. 1821 # 68user 2001/03/14 (水) 12:23:19
>>1820 みみ
> 各クライアントが順不同のタイミングで接続してきた場合、
> どのクライアントがどのソケットに接続しているのかを知るのには、
> どのような方法があるのでしょうか?

http://X68000.startshop.co.jp/~68user/net/c-echo-2.html
を見てください。
    getpeername(sock, (struct sockaddr *)&peer_sin, &len)
でソケットの接続先のアドレス (IP アドレス+ポート番号の
情報) が peer_sin に格納されます。

    - IP アドレス … inet_ntoa(peer_sin.sin_addr)
    - ホスト名 … gethostbyaddr
    - ポート番号 … ntohs(peer_sin.sin_port)
でそれぞれ取得できます。

そのページのサンプルの echo-server-select.c では、
accept したときに struct CLIENT_INFO という構造体に
ホスト名・IP アドレス・ポート番号を格納し、その後
クライアントの情報が必要になったら struct CLIENT_INFO を
参照していますが、毎回ソケットに対して getpeername
しても動作はします。

No. 1822 # みみ 2001/03/14 (水) 17:56:54
素早い解答、ありがとうございます。
確認の意味で、質問をさせて頂きます。

そうすると、サーバ側の処理としては、下記のように
なるということでしょうか?
・クライアントからの接続がある。
  (sd[i]がインクリメントされる。)
・接続してきたクライアントからの処理要求がある。
  (ここで、クライアント側のプロセスが何なのかが判明する。)
・getpeername を行うことで、sd[i]の”i”の値を得る。
  (これにより、接続元クライアントのプロセスとを
    リンクさせることができる。)

上記のような解釈で、誤りがありませんでしょうか?

getpeername については、もう少し勉強をしてみます。
(実は、サンプルプログラムで良く理解できていなかった部分です。
クライアント情報を格納しているのは判ったのですが。
付け焼き刃のかなしさです。でも頑張ります。)

本当に、ありがとうございます。
後程、結果を報告に来ます。

No. 1823 # 68user 2001/03/15 (木) 01:57:20
>>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 アドレスやポート番号を知りたい
場合に使いますが、根本的にはそれらの情報がなくてもどの
クライアントとやりとりしているのか区別できます。

No. 1824 # みみ 2001/03/15 (木) 10:55:34
あ、また書き込んでくださったのですね。
重ね重ね、ありがとうございます。

>>1823の内容からすると、
「selectにより、各クライアントを固有のものとして認識できる為、
サーバ側でプログラム的に管理しなくても大丈夫。」
ということなのでしょうか?
(うう、一所懸命にプログラム書いちゃいましたけど。)

昨日の書き込み(1822)の内容の処理を行うプログラムは、
意図した通りの動作をしていることは、確認できました。
が。
システムコールに依存した方が信頼性は高いので、
もう一度、見直すことにします。

ありがとうございました。
また、報告に伺います。

Prev< No. 1816〜1824> Next  [最新発言に戻る] [過去ログ一覧]