Network Kit目次     Network Kit索引

BNetEndpoint

継承: BArchivable

宣言: be/net/NetEndpoint.h

ライブラリ: libnetapi.so

アロケーション: コンストラクタのみ

概要

BNetEndpointクラスは、データの送信や受信、ネットワーク接続、ローカルアドレスへの関連付け、新しい接続の聴取と受け入れができるネットワークの端点を代表する。

すでに存在するネットワークのアーキテクチャに置き換わるというよりは、BNetEndPointクラスは標準のソケット関数のC++で書かれたラッパーを提供する。すべての使用規則はまったく同じである(?)。BSDライクなCソケット関数の資料も復習してください。


BNetEndpointをアーカイブする。

BNetEndPointオブジェクトはアーカイブできる。すべてのBNetEndPointの属性はアーカイブされるときに保存される。再び復元されるときオブジェクトは正確に戻る。これは面白い結果である—もしBNetEndPointがアーカイブされたときにリモートシステムに接続されていたら、復元されたアーカイブもそのシステムに接続されているのである。あなたはアクティブな接続をのちに復元するためにアーカイブすることができる。

しかしながら、あきらかにプロトコル特有の情報は、アーカイブにデータを自分で追加しない限りセーブされない。例えばFTP接続をアーカイブして、アーカイブから接続を復元したら、ワーキングディレクトリや進行中のダウンロードは自動的には復元されない。


コンストラクタデストラクタ


BNetEndpoint()

                                                         
  

BNetEndpoint(int protocol = SOCK_STREAM)

BNetEndpoint(const BNetEndpoint &)

BNetEndpoint(BMessage *archive)

ローカルシステムにネットワークの接続の端点を代表するBNetEndpointを作成する。作成したあとは作成中にエラーが発生していないことを確認するためにInitCheck()を呼び出さなくてはならない。

protocol引数にはBNetEndpointがストリームソケット(SOCK_STREAM)を使用するかデータグラムソケット(SOCK_DGRAM)を使用するか指定する(訳注:ストリームソケットがデータ受信に信頼性のあるTCPプロトコル、データグラムソケットがデータ受信に信頼性のないUDPプロトコルを使用します)

デフォルトではI/Oブロッキングとアドレスの再使用はオフになっています。これらはSetNonBlocking()SetReuseAddr()関数によって設定することができます。


~BNetEndpoint

                                                         
  

virtual ~BNetEndpoint()

典型的なデストラクタ


メンバ関数


Accept()はListen()

を参照してください


Bind()

                                                         
  

virtual status_t Bind(const BNetAddress &address)

virtual status_t Bind(int port = 0)

BNetEndPointと特定のローカルアドレスに関連付けます。アドレスは BNetAddressや単純なport番号によって指定できます。これはローカルの接続の端点を操作するポートを選択します。

もし、BNetEndPointがストリームプロトコルを使用し接続の聴取をしていたらBind()を呼び出す必要があります。

もし、ストリームのBNetEndPointがクライアントだったらBind()を呼び出す必要はありませんが、したかったらしてもかまいません。しかし、そうすることな重大な意義はありません。

接続を受け入れるストリームのBNetEndPointは関連付けられている必要があります。

データを受信するデータグラムBNetEndPointは関連付けの必要があります。データを送信するだけのデータグラムBNetEndPointは関連付けの必要はありません。しかし、送信と受信の両方をする端点は関連付けの必要があります。

もし、アドレスやポート番号を特定しないのなら、ポート番号に0を渡せば Bind()関数はBNetEndPointをランダムなローカルポートに関連付けます。LocalAddr()関数によってローカルアドレスを決定することもできます。

BNetEndPointをあるアドレスやポートから関連付けを解除するには端点を閉じるしかありません。

返値

B_OK . アドレスがちゃんと関連付けされた。

  • B_ERROR. エラーが発生した。


    Close()

                                                             
      

    virtual void Close(void)

    ひとつだけだったら接続を閉じる。読まれていないデータがあったら、それは捨てられる。


    Connect()

                                                             
      

    virtual status_t Connect(const BNetAddress &address)

    virtual status_t Connect(const char *address, int port)

    指定されたリモートシステムへ接続を開く。システムのアドレスはBNetAddress またはIPアドレスやドメイン名と、ポート番号を指定することによって指定できる。例えばMegaburger株式会社のウェブサーバーに接続するためには、ソフトウェアにこう書けばよい。

       status_t err = myEndpoint->Connect("www.megaburger.com", 80);
       if (err != B_OK) {
          /* エラー発生 */
       }
       else {
          /* すべてはうまくいっている。接続を開く */
       }

    返値

    B_OK. 接続は開かれた。


    Error() , ErrorStr()

                                                             
      

    int Error(void) const

    char *ErrorStr(void) const

    Error()関数は最後の送信または受信に関する整数値のエラーコードを返す。もしB_ERROR の結果を送信や受信の関数から受け取ったら、この関数を使って原因を特定することができる。

    ErrorStr()関数はエラーのことを記述するテキスト文字列へのポインタを返す。この文字列はあなたの物ではないので絶対にfree()(開放)しようとしてはいけない。


    InitCheck()

                                                             
      

    status_t InitCheck(void) const

    ちゃんと初期化されたかどうかを示すstatus_t型の変数を返す。

    返値

    B_OK. BNetEndPointはちゃんと作成された。


    IsDataPending()

                                                             
      

    virtual bool IsDataPending(bigtime_t timeout = 0)

    受信を待っているデータがあったらtrueを返しそれ以外はfalseを返す。もしtimeoutを0以外に指定したら、この関数はデータが利用可能になるかtimeout(タイムアウト)の時間が経つまでブロックする。


    Listen() , Accept()

                                                             
      

    virtual status_t Listen(int backlog = 5)

    virtual BNetEndpoint *Accept(int32 timeout = -1)

    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. 成功


    LocalAddr() , RemoteAddr()

                                                             
      

    const BNetAddress &LocalAddr(void)

    const BNetAddress &RemoteAddr(void)

    これらの関数は接続中のローカルまたはリモートシステムを代表する BNetAddressを返す。 LocalAddr()はローカルマシンへのアドレスを返す。そしてRemoteAddr()は (驚くほど十分な)リモートシステムへのアドレスを返す(?)。

    リモート接続でなかったら、RemoteAddr()関数はBNetAddressに0.0.0.0を示すIPアドレスを返す。


    Receive() , ReceiveFrom()

                                                             
      

    virtual int32 Receive(const void *buffer, size_t size, int flags = 0)

    virtual int32 Receive(BNetBuffer &buffer, size_t size, int flags = 0)

    virtual int32 ReceiveFrom(const void *buffer, size_t size, const BNetAddress &from,
          int flags = 0)

    virtual int32 ReceiveFrom(BNetBuffer &buffer, size_t size, const BNetAddress &from,
          int flags = 0)

    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.hrecv() 関数または recvfrom() 関数に渡す flags 引数は現在は使われておらず、0でなくてはいけません。

    これらの関数を(デフォルトである)ブロッキングモードで使用したら、データが使用可能になるか、タイムアウトになるまでブロックする。タイムアウトの時間はSetTimeout() 関数によって設定できる。 SetNonBlocking() 関数の呼び出しによってブロックのオン、オフが出来る。もし、ブロッキングモードを使用せずに、待機中のデータがなければ、これらの関数は、待機中のデータがないことを示すために0か即座に返ってくる。

    これらの関数は実際に受け取ったバイト数が返ってくる。エラーが起こったときは-1を返す。Error() 関数によってエラーを特定することが出来る。


    RemoteAddr() は LocalAddr()を参照してください


    Send() , SendTo()

                                                             
      

    virtual int32 Send(const void *buffer, size_t size, int flags = 0)

    virtual int32 Send(BNetBuffer &buffer, int flags = 0)

    virtual int32 SendTo(const void *buffer, size_t size, const BNetAddress &to,
          int flags = 0)

    virtual int32 SendTo(BNetBuffer &buffer, const BNetAddress &to, int flags = 0)

    Send()関数は buffer のデータをリモート接続に送る。もし、接続が確立されていなかったら B_ERROR が即座に返ってくる。付け加えて言うと、BNetEndpointがデータグラムプロトコル用になっていたら、この関数はあて先のアドレスがわかってからConnect() 関数が呼ばれるまで失敗する。

    SendTo()関数はバッファを to 引数の BNetAddressで指定されたリモートシステムに送る。 SendTo() 関数は接続がデータグラムプロトコルを使用しているときにのみ働く。

    それぞれの関数の最初の書式では、示されたsizeの分、任意に bufferを送る。2番目の書式では, BNetBufferの内容を送る。(訳注:Receive()関数にあった文と同じ文が書かれています)

    socket.hsend() 関数または sendto() 関数に渡す flags 引数は現在は使われておらず、0でなくてはいけません。

    これらの関数は実際に送信したバイト数が返って来ます。エラーが起きたときは-1か返ります。 Error()関数によってエラーの内容と特定することが出来ます。


    SetOption() , SetNonBlocking() , SetReuseAddr()

                                                             
      

    int SetOption(int32 option, int32 level, const void *data, unsigned int dataSize)

    int SetNonBlocking(bool enable = true)

    int SetReuseAddr(bool enable = true)

    SetOption() はBNetEndpointのオプションを設定することが出来ます。これはsetsockopt()の土台にあるソケットへのアクセスを提供します。

    SetNonBlocking() 関数はI/O(訳注:データの送信と受信)がブロックするかしないかを設定する。enabletrueだったら、接続はブロックしない。enablefalseだったら送信または受信の関数が呼ばれるとき、転送が完了するまで接続はブロックするようになる。

    SetReuseAddr() 関数はアドレスを再利用するかどうかを設定する。enabletrueだったらアドレスは再利用される。enablefalseだったら接続は再利用されない。

    これらの関数は成功すると0を返し、それ以外では-1を返す。


    SetProtocol()

                                                             
      

    status_t SetProtocol(int protocol)

    接続のプロトコルタイプをセットする。 protocol 引数に渡してもよい値は SOCK_STREAM (ストリームプロトコルを使用する場合) か SOCK_DGRAM (データグラムプロトコルを使用する場合)です。

    返値

    B_OK. プロトコルはきちんと設定された。


    SetTimeout()

                                                             
      

    void SetTimeout(bigtime_t timeout)

    Receive()ReceiveFrom()関数使用時のタイムアウトの設定をする。ブロッキングが使用されていたら、timeout マイクロ秒たったら、関数はエラーとともに中止する。デフォルトでは、タイムアウトしない。-1を指定することによって、タイムアウトさせなくすることが出来る。


    Socket()

                                                             
      

    int Socket(void) const

    データのやり取りのためにBNetEndpointによって使用されている、実際のソケットを返す。


    演算子


    = (assignment)

                                                             
      

    BNetEndpoint &operator =(const BNetEndpoint &from)

    BNetEndpointを from から左辺値にコピーする。それによってオブジェクトの複製を作る。もし、from が接続されていたら、左辺値も同じ接続を開く。


    NetworkKit目次     NetworkKit索引
    訳者 big56