recvtd は daemon モードで起動します。recvt でオプション -D を指定した時と同じ動作です。
制御ファイル
ctlfile
が与えられた場合は、その中にリストされたチャネルのデータだけが
受信されます。ただし制御ファイル名の先頭に '-' を付けたときは、
そのファイルにリストされた以外の全チャネルのデータが受信されます。
制御ファイル名の先頭に '-' を付ける効果はチャネル番号による制御の
意味のみを逆転するもので、後述するホスト制御には影響しません。
ctlfile
が与えられないか、または '-' である場合は、全チャネルが受信されます。
制御ファイル
ctlfile
には、
1行に1チャネルずつ指定された16進数のチャネル番号(ただし"*"は
「すべてのチャネル」を表す)、または
"+"か"-"で始まるホスト制御行を書くことができます。
チャネル番号を指定した行とホスト制御行は、混在していてもかまいません。
いずれの行も空白またはタブで区切られた左端の項目だけが読まれ、
その行の以降の部分は読み飛ばされます。'#'で始まる行はコメントと
見なされます。
ホスト制御行は、
-host[:port] パケットがhost[:port]からであれば捨てる
+host[:port] パケットがhost[:port]からであれば受け入れる
+ パケットを受け入れる
- パケットを捨てる
の形式で書かれたルールです。ホスト名のあとに:で区切ってポート番号を
書いた場合は、ホストとポートの組が一致した場合にのみ有効になります。
ホスト制御については、パケットごとにルールを上から当てはめていき、
当てはまるルールがあったらそれが適用されます。最後まで当てはまるルールが
なかったらそのパケットを受け入れます(つまり最後にはかならず "+" の行が
あるのと同じ)。
ログファイル名 logfile を指定すると、ここに動作ログがとられます。指定しないとログ情報は標準出力に 送られます(ただし、daemon モードで動いている時は syslogd(8) に送られま す)。ログファイルは書き込みのたび毎にオープン/クローズされます。
recvt は、HUPシグナルを受けると制御ファイル
ctlfile
と後述の
chfile
を読み直し、ログファイル
logfile
に送り元ホストごとの流量情報を書き出します。これには起動時、または
前回HUPシグナルを受けたときからの、
パケット数、バイト数、毎秒パケット数、毎秒バイト数が含まれます。ただしこの期間に1パケットも受信してない送り元 ホストについての情報は書き出しません。
recvt は受信するデータのチャネル番号ごとに過去10パケットまでの タイムスタンプの履歴を保存しており、同じチャネル番号で10パケット 以内に同じタイムスタンプのデータ(この場合1チャネル×1秒分の ブロックのことです)が来ると、重複しているものとしてそのデータを廃棄します。 この機能は、設定のミスによって無限ループができてデータが増殖する ことを防ぐことや、複数の送信元から1つの受信ポートへわざと重複した データを送信しておく冗長構成を可能にします。
recvt が受信するデータは、一般に記録の時間順に送られてくるとは 限りません。この場合、recvt が書き込んだ共有メモリ上でも、データは 時間順にはなりません。order(1W) はこれを時間順に並べ変えます。
recvt は引数なしで起動すると簡単な使用法を表示します。
(1)1バイトのパケット番号(0〜255)
(2)1バイトの「元の」パケット番号(0〜255)
(3)1バイトの識別コード(16進数で) "A0"
(4)2バイトのブロックサイズ((4)〜(6)部分の合計バイト数)
(5)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
時(00〜23)、分(00〜59)、秒(00〜59)
(6)同一秒の1チャネル分以上のデータ(win形式)
以降(4)〜(6)の繰り返し
で、これは通常 send_raw(1W)ファミリ(send_raw, sendt_raw, send_mon,
sendt_mon)が送信したり、それをrelay(1W)が中継して来るものです。
(1)は送信元ポートが
各パケットにつける、1ずつ増える番号です(255の次は0に戻ります)。
(2)には通常(1)と等しい値が入っていますが、再送パケットの場合には、
(2)には再送要求された元のパケットの番号が入っていて、それが
再送パケットであることを示します。
1パケットのサイズは1472バイト以内(IPパケットサイズで1500バイト
以内)で、伝送効率のため、通常は
なるべく大きくなるように上記(4)〜(6)の部分を次々に追加して
生成されます。なお、recvt は互換性のために、1パケットに1秒分しか
収容しない旧型のパケット形式
(1)1バイトのパケット番号(0〜255)
(2)1バイトの「元の」パケット番号(0〜255)
(3)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
時(00〜23)、分(00〜59)、秒(00〜59)
(4)1チャネル分以上のデータ(win形式)
も受け入れることができます。
(1)4バイトのブロックサイズ(バイト)
(2)4バイトの「書き込み時刻」
(3)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
時(00〜23)、分(00〜59)、秒(00〜59)
(4)同時刻の1チャネル分以上のデータ(win形式)
(2)は1970年1月1日0時から数えた秒数で示され、order(1W) が
データを時間順に整列させるときに、タイムアウトを設定するのに
利用されます。共有メモリ
・セグメント全体は、次のような構造体になっています。
struct Shm {
unsigned long p; /* write point */
unsigned long pl; /* write limit */
unsigned long r; /* latest */
unsigned long c; /* counter */
unsigned char d[SIZE]; /* data buffer */
} *sh;
p, pl, r, c は管理用の変数、d がデータの領域で、これらはすべて
1つの書き込み側プロセスによって書き込まれます。読み出し側プロセスは
これらの変数を使って同期をとって、データを読み出します。
recvt は、連続して受け取ったデータパケットの 時刻が同じである限り、共有メモリ上の1つのデータブロックを 拡張していきます。従って受信したパケットと共有メモリ上のデータ ブロックは必ずしも1対1には対応せず、同じ時刻の複数のパケットは、 1つのデータブロックにまとめられます。
(1)4バイトのブロックサイズ(バイト)
(2)4バイトの「書き込み時刻」
(3)6バイトの時刻ヘッダー(年〜秒、各1バイト、BCD形式)
年の下2桁(00〜99)、月(01〜12)、日(01〜31)、
時(00〜23)、分(00〜59)、秒(00〜59)
(4)同時刻の1チャネル分以上のデータ(win形式)
(5)4バイトのブロックサイズ(バイト)
これはデフォールトの形式と(5)の部分だけが異なります。(1)と(5)には
同じ値が入っており、これは(1)〜(5)をすべて含んだ1ブロックの
サイズです。この形式は、後方から(アドレスの高い方から低い方へ)
のサーチを可能にするためのものです。この形式では、共有メモリ構造体の
中の変数 pl は、共有メモリ先頭に戻る直前に書き込まれた最後の
ブロックの(5)の位置を示します。読み出し側プロセスは、pl を
「ここを越えては新しい秒ブロックに入らず先頭に戻る位置」として
使用することができるとともに、後方サーチの起点(先頭から折り返して戻る点)
として利用することができます。読み出し側プログラムでは、共有メモリが
この形式であるかどうかを自動判別するのが普通です。
この形式は、order(1W) の絶対時刻準拠モードに利用されています。
(1)4バイトの文字列 "REQ\0"
(2)2バイトのパケット番号(値は0〜)
(3)2バイトのパケット数(値は0〜)
(4)チャネル数×2バイトのチャネル番号のリスト(最大512個)
すべてのチャネルを要求する場合は、(2)と(3)がいずれもゼロで、
(4)はありません。要求するチャネル数が512以下の場合は、
(2)と(3)がいずれも1で、(4)にチャネル番号が羅列されます
(特にチャネル数がゼロの場合は(4)がありません)。
要求するチャネル数が512を超える場合は、複数(ここでN個とします)の
パケットに分割して送られます。その場合、(3)にはNが入り、(2)には
N個中何番目のパケットであるか(1〜N)が入ります。
送信要求パケットは、通常 -f オプション付きの send_raw(1W) ファミリ
により受信され解釈されます。送信要求の宛先は、正確に
データパケットの送信元ホスト/ポートでなければ送信元に対する効果は
なく、そのためには一般的には送信元の send_raw(1W) ファミリは
-p オプションで送信元ポートを指定されている必要があることに
注意してください。
(1) recvt 7000 11 1000 ctlfile
で、ctlfile の内容が
+goodhost
-
*
である場合。
(2) recvt 7000 11 1000 -ctlfile
で、ctlfile の内容が
+goodhost
-
である場合。