質問

私は少し戸惑いソケットプログラミングC.

を作成するソケットにバインドされたインターフェースおよびIPアドレスを取得できました。このウェブ資源に関する、理解です。特に、この記事 ネットワークプログラミングの下でのUnixシステム することができます。

何を混乱させたタイミングのデータのストリートソケットが開かれます。

どのようにしないといけないと考えていの場合パケットの到着は、大きなパケットがないのは重いものを持ち上げ理由を教えてください。

私の基本的な前提は、パケットでの可変長れていると言えるだろうバイナリデータ入されても、ソケットどうかという話があったようだ開始をパケットから。

役に立ちましたか?

解決

答えはまだ重いものを持ち上げます。で通知することが読み込めるデータがいかに多くのバイトが可能です。多くのIPプロトコルを使用する可変長パケットがヘッダの既知の固定長の前に追加されるのです。このヘッダが含まれますの長さです。書の記載事項をよく読んでヘッダを取得しlengthのパケットのことを指し、パケット.を繰り返しますこのパターン(読み取りヘッダを読みパケットまでの通信が完了します。

読み込み時にデータからのソケットのご依頼は一定のバイトです。を読む場合がありまでブロック要求されたバイト数を読み込みが戻ることができるバイト数はnよりも少ないよう求められました。そうなると、まだ再度、読み込みに請求の残りバイトまでとなります。

ここでの典型的なC関数を読み込むための定数のバイトからソケット:

/* buffer points to memory block that is bigger than the number of bytes to be read */
/* socket is open socket that is connected to a sender */
/* bytesToRead is the number of bytes expected from the sender */
/* bytesRead is a pointer to a integer variable that will hold the number of bytes */
/*           actually received from the sender. */
/* The function returns either the number of bytes read, */
/*                             0 if the socket was closed by the sender, and */
/*                            -1 if an error occurred while reading from the socket */
int readBytes(int socket, char *buffer, int bytesToRead, int *bytesRead)
{
    *bytesRead = 0;
    while(*bytesRead < bytesToRead)
    {
        int ret = read(socket, buffer + *bytesRead, bytesToRead - *bytesRead);
        if(ret <= 0)
        {
           /* either connection was closed or an error occurred */
           return ret;
        }
        else
        {
           *bytesRead += ret;
        }
    }
    return *bytesRead;
}

他のヒント

ので、不明な点があれば、ここでお答えによりイベントカレンダーかどうかをご利用のUDPやTCPとしてます。

UDP、生命く簡単になり、話ができrecv/recvfrom/recvmsgのパケットサイズをしてくださいが送固定長パケットのソースからとにかく)前の場合にデータが入手可能であり複数のパケット長のサイズです。(イタリアンモーダアプリをお電話のrecv*は、サイズのパケット送信側といを設けさせていただきます。)

TCP、生命がグランパスと清水エスパルスの目的はここで説明させていただいておりますがりますが、既にご存知の方法を使用ソケット),bind()、()、および受け入れ側(あるい)についてどのようにファイル記述子(FD)を新たに作りました。

が常に正確なものであることをやっているI/Oのためのソケット-ブロックを呼び出すread(fd buf,N)の座にありまで待機しまっNバイトを読み込buf-非ブロッキングをしているチェックをselect()、poll()するか否かのFD読み取り可能、そしてないのread().

処理時のTCPのつのOSないのにパケットサイズでの検討を継続的にデータを、別のパケットサイズのチャンク.

アプリケーションの場合は使用してパケット"(満載またはアンパックデータ構造(かんなパスを回しながら、すべを呼び出すことができるのread()の適切なサイズの引数を読み込むため全体のデータ構造のソケットです。の点に注意して対応し、忘れずに適切にバイトのための任意のデータをい場合、ソースとデスティネーションシステムの異なるバイトのエンディアン-判断します。)この両方に適用されUDP、TCP.

どの*NIXソケットプログラミング関するお勧めしますW.リチャード-スティーブンス'"Unixネットワークプログラミング,Vol.1"(UNPv1)、"高度なプログラミング、Unix環境"(APUE).一つ目は、留に関するネットワークによるプログラミングにかかわらず、輸送、後者は全周囲画書としてこの制度の対象となる*NIX系プラグインです。また、"TCP/IP図"には、ボリューム1および2.

だけど、読み取りのソケットをしないといけないと考えていなど多くの最大バイトを読みながっていることを確認してくださいていることが多く、これまでよりも速やかにしました。するのはデザインのプロトコルできるかどうかなんかの一部をパケットします。例えば、過去に送信時に可変長のバイナリデータだからこそ実現できるintを始めたバイト数をいて評価する必要があります。思い読み取りを要求するバイト数より大きい可能な限り最大パケットに私のプロトコルとした比較初のint値に対して多くのバイトさんを受けてから、外出してください。工程で使って読み込みまでの思いをフルパケットによっては、.

ソケット操作の高い原料をパケットでのようにファイルで読み書きできます。また、読み込みソケットから、運営システムのブロック(リクエストを保留にした)までの過程でデータを満たします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top