したがって、質問に対する答えは、トランスポートとしてUDPとTCPのどちらを使用しているかによってかなり異なります。
UDPの場合、必要なパケットサイズでrecv / recvfrom / recvmsgを呼び出すことができ(とにかくソースから固定長のパケットを送信する可能性があります)、データが利用可能であると想定できるため、作業ははるかに簡単になります。 、パケット長のサイズの倍数であります。(つまり、送信側のパケットのサイズでrecv *を呼び出すと、設定が完了します。)
TCPの場合、人生はもう少し興味深いものになります-この説明の目的のために、socket()、bind()、listen()、accept()の使い方をすでに知っていると仮定します-後者はあなたが得る方法です新しく作成された接続のファイル記述子(FD)。
ソケットのI/Oを実行する方法は2つあります。ブロッキングでは、read(fd、buf、N)を呼び出し、読み取りはそこにとどまり、Nバイトをbufに読み込むまで待機します。または非ブロッキングです。ここで、FDが読み取り可能かどうかを(select()またはpoll()を使用して)チェックし、次にread()を実行する必要があります。
TCPベースの接続を処理する場合、OSはパケットサイズに注意を払いません。これは、個別のパケットサイズのチャンクではなく、データの継続的なストリームと見なされるためです。
アプリケーションで「パケット」(渡されるパックまたはアンパックのデータ構造)を使用する場合は、適切なサイズの引数を指定してread()を呼び出し、一度にソケットからデータ構造全体を読み取ることができるはずです。対処しなければならない唯一の注意点は、送信元システムと宛先システムのバイトエンディアンが異なる場合に備えて、送信するデータを適切にバイトオーダーすることを忘れないことです。これは、UDPとTCPの両方に適用されます。
* NIXソケットプログラミングに関する限り、W。リチャードスティーブンスの「Unixネットワークプログラミング、Vol。1」(UNPv1)および「Unix環境での高度なプログラミング」(APUE)を強くお勧めします。前者は、トランスポートに関係なく、ネットワークベースのプログラミングに関する本であり、後者は、*NIXベースのプログラミングに適用される優れた万能プログラミングの本です。また、「TCP / IP Illustrated」、第1巻および第2巻を探してください。