| Network Kit目次 | Network Kit索引 |
継承: BArchivable
ライブラリ: libnetapi.so
アロケーション: コンストラクタのみ
BNetEndpointクラスは、データの送信や受信、ネットワーク接続、ローカルアドレスへの関連付け、新しい接続の聴取と受け入れができるネットワークの端点を代表する。
すでに存在するネットワークのアーキテクチャに置き換わるというよりは、BNetEndPointクラスは標準のソケット関数のC++で書かれたラッパーを提供する。すべての使用規則はまったく同じである(?)。BSDライクなCソケット関数の資料も復習してください。
BNetEndPointオブジェクトはアーカイブできる。すべてのBNetEndPointの属性はアーカイブされるときに保存される。再び復元されるときオブジェクトは正確に戻る。これは面白い結果である—もしBNetEndPointがアーカイブされたときにリモートシステムに接続されていたら、復元されたアーカイブもそのシステムに接続されているのである。あなたはアクティブな接続をのちに復元するためにアーカイブすることができる。
しかしながら、あきらかにプロトコル特有の情報は、アーカイブにデータを自分で追加しない限りセーブされない。例えばFTP接続をアーカイブして、アーカイブから接続を復元したら、ワーキングディレクトリや進行中のダウンロードは自動的には復元されない。
|
ローカルシステムにネットワークの接続の端点を代表するBNetEndpointを作成する。作成したあとは作成中にエラーが発生していないことを確認するためにInitCheck()を呼び出さなくてはならない。
protocol引数にはBNetEndpointがストリームソケット(SOCK_STREAM)を使用するかデータグラムソケット(SOCK_DGRAM)を使用するか指定する(訳注:ストリームソケットがデータ受信に信頼性のあるTCPプロトコル、データグラムソケットがデータ受信に信頼性のないUDPプロトコルを使用します)
デフォルトではI/Oブロッキングとアドレスの再使用はオフになっています。これらはSetNonBlocking()とSetReuseAddr()関数によって設定することができます。
|
典型的なデストラクタ
|
BNetEndPointと特定のローカルアドレスに関連付けます。アドレスは BNetAddressや単純なport番号によって指定できます。これはローカルの接続の端点を操作するポートを選択します。
もし、BNetEndPointがストリームプロトコルを使用し接続の聴取をしていたらBind()を呼び出す必要があります。
もし、ストリームのBNetEndPointがクライアントだったらBind()を呼び出す必要はありませんが、したかったらしてもかまいません。しかし、そうすることな重大な意義はありません。
接続を受け入れるストリームのBNetEndPointは関連付けられている必要があります。
データを受信するデータグラムBNetEndPointは関連付けの必要があります。データを送信するだけのデータグラムBNetEndPointは関連付けの必要はありません。しかし、送信と受信の両方をする端点は関連付けの必要があります。
もし、アドレスやポート番号を特定しないのなら、ポート番号に0を渡せば Bind()関数はBNetEndPointをランダムなローカルポートに関連付けます。LocalAddr()関数によってローカルアドレスを決定することもできます。
BNetEndPointをあるアドレスやポートから関連付けを解除するには端点を閉じるしかありません。
返値
B_OK . アドレスがちゃんと関連付けされた。
|
ひとつだけだったら接続を閉じる。読まれていないデータがあったら、それは捨てられる。
|
指定されたリモートシステムへ接続を開く。システムのアドレスはBNetAddress またはIPアドレスやドメイン名と、ポート番号を指定することによって指定できる。例えばMegaburger株式会社のウェブサーバーに接続するためには、ソフトウェアにこう書けばよい。
status_t err = myEndpoint->Connect("www.megaburger.com", 80);
if (err != B_OK) {
/* エラー発生 */
}
else {
/* すべてはうまくいっている。接続を開く */
}
返値
B_OK. 接続は開かれた。
|
Error()関数は最後の送信または受信に関する整数値のエラーコードを返す。もしB_ERROR の結果を送信や受信の関数から受け取ったら、この関数を使って原因を特定することができる。
ErrorStr()関数はエラーのことを記述するテキスト文字列へのポインタを返す。この文字列はあなたの物ではないので絶対にfree()(開放)しようとしてはいけない。
|
ちゃんと初期化されたかどうかを示すstatus_t型の変数を返す。
返値
B_OK. BNetEndPointはちゃんと作成された。
|
受信を待っているデータがあったらtrueを返しそれ以外はfalseを返す。もしtimeoutを0以外に指定したら、この関数はデータが利用可能になるかtimeout(タイムアウト)の時間が経つまでブロックする。
|
Listen()関数はローカルポートへの接続の試みを聴取する。これはキューにたまる。backlog個の接続の試みがキューにためられる。より多くの試みがバックログされると、遅いほうの接続の試みはキューに空きができるまで拒否される。
Accept()関数によって来ている接続の試みを受け入れることができる。もし、なんの接続の試みもキューに入っていなかったらこの関数はNULLを返す。もし、キューに接続の試みが入っていたら、新しいBNetEndPointオブジェクトがローカルポートとともに作成されリモートシステムが開く。そのBNetEndPointが返ってくる。
新しい接続はあなたのしたいようにすればいい(?)。接続を終了したときには返ってきたBNetEndPointをdeleteしなければならない。典型的なリスナースレッドはこのようになる。
long MyListener(void *data) {
BNetEndpoint endpoint;
if (endpoint.InitCheck() < B_OK) {
return -1;
}
endpoint.Bind(portNumber); /* 目的のポートに関連付け */
endpoint.Listen(); /* 接続の聴取 */
while (keepListening) {
BNetEndpoint *connect = NULL;
connect = endpoint.Accept();
if (connect) {
handle_connection(connect, data); /* 仕事のために関数を呼ぶ */
delete connect;
}
}
endpoint.Close();
}
返値
B_OK. 成功
|
これらの関数は接続中のローカルまたはリモートシステムを代表する BNetAddressを返す。 LocalAddr()はローカルマシンへのアドレスを返す。そしてRemoteAddr()は (驚くほど十分な)リモートシステムへのアドレスを返す(?)。
リモート接続でなかったら、RemoteAddr()関数はBNetAddressに0.0.0.0を示すIPアドレスを返す。
|
Receive()関数はbufferにリモートの端点からデータを受け取る。どの接続も確立されてなかったらB_ERRORが即座に返ってくる。sizeバイトのデータまで受け取る。
ReceiveFrom()関数はfromのBNetAddressで示されたリモートシステムからバッファにデータを受け取る。ReceiveFrom()は接続がデータグラムプロトコルの時のみ働く。
それぞれの関数の最初の書式では、示されたsizeの分、任意に
bufferに受け取る(?)。2番目の書式では, BNetBufferに受け取る(?)。
(訳注:前の2つの訳の原文はSend()関数にあった文とまったく同じ内容が書かれています。おそらくsendはreceiveの間違いだと思われます。原文 The first form of each function function sends an arbitrary buffer of the specified size, and the second form sends the contents of a BNetBuffer. )
BNetBufferを使用したときは、受け取ったデータはバッファの最後に追加される。従って、同じバッファを受け取ったデータが読まれるまで、使用することができる(?)。
(訳注:ちょっと意味がとりづらいです。原文 so you can use the same buffer in a loop to buffer incoming data in chunks until the desired number of bytes have been read.)
socket.h の recv() 関数または recvfrom() 関数に渡す flags 引数は現在は使われておらず、0でなくてはいけません。
これらの関数を(デフォルトである)ブロッキングモードで使用したら、データが使用可能になるか、タイムアウトになるまでブロックする。タイムアウトの時間はSetTimeout() 関数によって設定できる。 SetNonBlocking() 関数の呼び出しによってブロックのオン、オフが出来る。もし、ブロッキングモードを使用せずに、待機中のデータがなければ、これらの関数は、待機中のデータがないことを示すために0か即座に返ってくる。
これらの関数は実際に受け取ったバイト数が返ってくる。エラーが起こったときは-1を返す。Error() 関数によってエラーを特定することが出来る。
|
Send()関数は buffer のデータをリモート接続に送る。もし、接続が確立されていなかったら B_ERROR が即座に返ってくる。付け加えて言うと、BNetEndpointがデータグラムプロトコル用になっていたら、この関数はあて先のアドレスがわかってからConnect() 関数が呼ばれるまで失敗する。
SendTo()関数はバッファを to 引数の BNetAddressで指定されたリモートシステムに送る。 SendTo() 関数は接続がデータグラムプロトコルを使用しているときにのみ働く。
それぞれの関数の最初の書式では、示されたsizeの分、任意に bufferを送る。2番目の書式では, BNetBufferの内容を送る。(訳注:Receive()関数にあった文と同じ文が書かれています)
socket.h の send() 関数または sendto() 関数に渡す flags 引数は現在は使われておらず、0でなくてはいけません。
これらの関数は実際に送信したバイト数が返って来ます。エラーが起きたときは-1か返ります。 Error()関数によってエラーの内容と特定することが出来ます。
|
SetOption() はBNetEndpointのオプションを設定することが出来ます。これはsetsockopt()の土台にあるソケットへのアクセスを提供します。
SetNonBlocking() 関数はI/O(訳注:データの送信と受信)がブロックするかしないかを設定する。enable が trueだったら、接続はブロックしない。enable が falseだったら送信または受信の関数が呼ばれるとき、転送が完了するまで接続はブロックするようになる。
SetReuseAddr() 関数はアドレスを再利用するかどうかを設定する。enable が trueだったらアドレスは再利用される。enable が falseだったら接続は再利用されない。
これらの関数は成功すると0を返し、それ以外では-1を返す。
|
接続のプロトコルタイプをセットする。 protocol 引数に渡してもよい値は SOCK_STREAM (ストリームプロトコルを使用する場合) か SOCK_DGRAM (データグラムプロトコルを使用する場合)です。
返値
B_OK. プロトコルはきちんと設定された。
|
Receive()と ReceiveFrom()関数使用時のタイムアウトの設定をする。ブロッキングが使用されていたら、timeout マイクロ秒たったら、関数はエラーとともに中止する。デフォルトでは、タイムアウトしない。-1を指定することによって、タイムアウトさせなくすることが出来る。
|
データのやり取りのためにBNetEndpointによって使用されている、実際のソケットを返す。
|
BNetEndpointを from から左辺値にコピーする。それによってオブジェクトの複製を作る。もし、from が接続されていたら、左辺値も同じ接続を開く。
| NetworkKit目次 | NetworkKit索引 |