PGM データの送受信
PGM データの送受信は、任意のソケットでのデータの送受信に似ています。 PGM に固有の考慮事項については、以下の段落で説明します。
PGM データの送信
PGM 送信側セッションが作成されると、さまざまな Windows ソケット送信機能 (send、sendto、WSASend、WSASendTo) を使用してデータが送信されます。 Windows ソケット ハンドルはファイル システム ハンドルであるため、 WriteFile 関数や CRT 関数などの他の関数でもデータを送信できます。 次のコード スニペットは、PGM 送信側操作を示しています。
LONG error;
//:
error = send (s, pSendBuffer, SendLength, 0);
if (error == SOCKET_ERROR)
{
fprintf (stderr, "send() failed: Error = %d\n",
WSAGetLastError());
}
メッセージ モード (SOCK_RDM) を使用する場合、send 関数を呼び出すたびに個別のメッセージが発生します。これは望ましくない場合があります。アプリケーションは、複数の呼び出しを送信する 2 MB のメッセージを 送信する必要がある場合があります。 このような状況では、送信側は RM_SET_MESSAGE_BOUNDARY ソケット オプションを設定して、次のメッセージのサイズを示すことができます。
送信ウィンドウがいっぱいの場合、ウィンドウが詳細設定されるまで、アプリケーションからの新しい送信は受け入れまれません。 非ブロッキング ソケットで送信しようとすると、WSAEWOULDBLOCK で失敗します。ブロッキング ソケットは、要求されたデータをバッファーに格納して送信できる時点にウィンドウが進むまでブロックするだけです。 重複した I/O では、ウィンドウが新しいデータに対応するのに十分な時間が進むまで、操作は完了しません。
PGM データの受信
PGM 受信側セッションが作成されると、さまざまな Windows ソケット受信機能 ( recv、 recvfrom、 WSARecv、 WSARecvFrom) を使用してデータが受信されます。 Windows ソケット ハンドルもファイル ハンドルであるため、 ReadFile 関数と CRT 関数を使用して PGM セッション データを受信することもできます。 転送は、データが順番に行われる限り、受信時にデータを受信側に転送します。 トランスポートは、返されるデータが連続しており、重複が含まないことを保証します。 次のコード スニペットは、PGM 受信操作を示しています。
LONG BytesRead;
//:
BytesRead = recv (sockR, pTestBuffer, MaxBufferSize, 0);
if (BytesRead == 0)
{
fprintf(stdout, "Session was terminated\n");
}
else if (BytesRead == SOCKET_ERROR)
{
fprintf(stderr, "recv() failed: Error = %d\n",
WSAGetLastError());
}
メッセージ モード (SOCK_RDM) を使用する場合、トランスポートは、WSAEMSGSIZE エラーが発生した場合、または WSARecv 関数と WSARecvFrom 関数からの復帰時に MSG_PARTIAL フラグを設定することによって、部分的なメッセージを受信するタイミング を 示します。 メッセージ全体の最後のフラグメントがクライアントに返されると、エラーまたはフラグは示されません。
セッションが正常に終了すると、受信操作は WSAEDISCON で失敗します。 トランスポートでデータ損失が発生すると、PGM は一時的にシーケンス外のパケットをバッファーに入れ、失われたデータの回復を試みます。 データ損失が回復不能な場合、受信操作は WSAECONNRESET で失敗し、セッションは終了します。 セッションは、次のようなさまざまな条件によりリセットできます。
- 受信側または受信接続速度が遅すぎて、受信データレートに対応する必要があります。
- ルーティングの問題、ネットワークの不安定性など、一時的なネットワーク状態が原因で、過度のデータ損失が発生する可能性があります。
- 送信者に回復不能なエラーが発生します。
- ローカル コンピューターで過剰なリソース使用率が発生します。たとえば、許容される内部バッファー ストレージの上限を超えたり、リソース不足状態が発生したりします。
- データ整合性チェックエラーが発生します。
- コンポーネント PGM の障害は、TCP/IP や Windows ソケットなどによって異なります。
上記の一覧の 1 番目と 2 番目の項目の両方で、リソースが不足する前、または最終的に送信者のウィンドウを超える前に、受信側が過剰なバッファリングを実行する可能性があります。
PGM セッションの終了
PGM 送信側または受信側は 、closesocket を呼び出すことによってデータの送受信を停止できます。 受信側は、ハンドル リークを防ぐために、リッスンソケットと受信側ソケットの両方で closesocket を呼び出す必要があります。 closesocket を呼び出す前に送信者に対してシャットダウンを呼び出すと、すべてのデータが確実に送信され、アプリケーション自体が終了した場合でも、送信ウィンドウが最後のデータ シーケンスを超えるまで修復データが維持されます。