次の方法で共有


Windows ソケット : アーカイブを使用するソケットの例

この技術情報では、クラス CSocket使用例を示します。例では、ソケットを使用してデータをシリアル化するために CArchive のオブジェクトを使用しています。これがファイルから、またはドキュメントのシリアル化ではないことに注意してください。

CSocket のオブジェクトを使用してデータを送受信するためにアーカイブを使用する方法を次の例に示します。例は、アプリケーション (の同じコンピューターまたはネットワークの異なるコンピューター)データ交換の 2 個のインスタンス設計されています。1 個のインスタンスは、他のインスタンスが受け取り、検証するデータを送信します。どのアプリケーションの交換を開始し、他のアプリケーションでサーバーまたはクライアントとして動作できます。次の関数は、アプリケーションのビュー クラスで定義されます:

void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
   BYTE bValue = 0;
   WORD nCopies = 0;

    if (arData.IsStoring())
    {
        CString strText;
        errno_t err;
        unsigned int number;

        for(int p = 0; p < nPackets; p++)
        {
            err = rand_s(&number);
            // if (err == 0)...
            bValue = (BYTE)(number%256);

            err = rand_s(&number);
            // if (err == 0)...
            nCopies = (WORD)(number%32000);

            // Send header information
            arData << bValue << nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Send data
                arData << bValue;
            }

            strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
            p + 1, nPackets, (int)bValue, nCopies);

            // Send receipt string
            arData << strText;
            arData.Flush();

            // Receive acknowledgment
            arAck >> strText;
            // display it
            DisplayMessage(strText);
        }
    }
    else
    {
        CString strText;
        BYTE bCheck;

        for(int p = 0; p < nPackets; p++)
        {
            // Receive header information
            arData >> bCheck >> nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Receive data
                arData >> bValue;
                if (bCheck != bValue)
            {
               AfxMessageBox(_T("Packet Failure"));
            }
         }

         // Receive receipt string and display it
         arData >> strText;
         DisplayMessage(strText);

         strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"), 
            p + 1, nPackets, (int)bValue, nCopies);

         // Send acknowledgment
         arAck << strText;
         arAck.Flush();
      }
    }
}

この例についての重要なときは、 MFC Serialize の作用する構造体の並列です。PacketSerialize のメンバー関数は else の句との if ステートメントで構成されます。関数では、パラメーターとして CArchive の 2 種類の参照を受け取ります: arData と arAck。arData のアーカイブ オブジェクトが送信 ()に保存設定されている場合、 if の分岐は実行します; それ以外 arData が読み込み、 ()に設定された場合は else の分岐を受け取ります。MFC のシリアル化に関する詳細については、 追加を参照してください。

[!メモ]

arAck のアーカイブ オブジェクトは arDataのオブジェクトと見なされます。arData が送信した場合は、 arAck は受け取り、その逆は true です。

送信するために、この例の関数は、ランダムなデータを生成するデモンストレーション オブジェクトで指定された回数に、毎回ループします。アプリケーションは、ファイルなどのソースからの実際のデータを取得します。arData アーカイブの出力ストリーム演算子 (<<)に 3 個の連続するチャンクのストリームを送信するために使用されています:

  • データの性質を指定する Header (何コピーが送信されるか)この場合、 bValue の変数の値および。

    項目は両方とも、この例に対してランダムに生成されます。

  • データのコピーの指定した数。

    for の内側のループが bValue に指定された回数を送信します。

  • 文字列はレシーバーがユーザーに表示 strText と呼ばれます。

受信では、関数は同様に動作します。ただし、アーカイブからデータを取得するには、のアーカイブ抽出**>>**演算子 ()を使用します。受信側アプリケーションが受け取るデータを検証し、最後の 「」受信メッセージを表示し、表示送信元アプリケーションに送信 「」というメッセージを送信しています。

この通信では、コミュニケーションの反対側に表示するには」、受け取る単語 「 strText の変数に送信されるメッセージですシミュレートするため、特定量のデータ パケットを受信してを受け取る側のユーザーに指定します。レシーバーは 「送信元」通知の送信元の画面に表示するための同様の文字列と応答します。両方の文字列の受信は、通信が発生したことを示します。

Caution メモ注意

確立された (非 MFC)サーバーと通信する MFC のクライアント プログラムを作成する場合は、アーカイブを通じて C++ オブジェクトを渡さないにします。サーバーがオブジェクト型を理解する MFC アプリケーション送信するとき、であるオブジェクトを受け取り、非シリアル化できません。技術情報 Windows ソケット: 処理命令 の例は、この型の通信を示します。

詳細については、 Windows ソケットの仕様を参照: htonlhtonsntohlntohs。また、詳細については、 " " を参照してください:

参照

関連項目

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

概念

MFC における Windows ソケット