다음을 통해 공유


Windows 소켓: 보관 파일을 사용 하 여 소켓 예

이 문서에서는 클래스를 사용 하는 예제를 제공 CSocket.이 예제를 사용 합니다. CArchive 소켓을 통해 데이터를 serialize 하는 개체입니다.Note이 파일 또는 문서 serialization 아닙니다.

다음 예제에서는 아카이브를 통해 데이터를 송수신 하는 방법을 보여 줍니다. CSocket 개체입니다.이 예제는 (같은 컴퓨터 또는 네트워크의 다른 컴퓨터에서) 응용 프로그램의 두 인스턴스가 데이터를 교환할 수 있도록 설계 되었습니다.인스턴스 데이터를 다른 인스턴스를 받고 통보를 보냅니다.두 응용 프로그램은 exchange를 시작할 수 있습니다 및 하나 서버 또는 클라이언트에 다른 응용 프로그램으로 작동할 수 있습니다.다음 함수는 응용 프로그램의 뷰 클래스에 정의 됩니다.

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 멤버 함수를 구성 하는 중에 경우 문을 사용 하 여는 다른 절.두 함수를 받는 CArchive 매개 변수로 참조: arData 및 arAck.경우는 arData (보내기)를 저장 하는 보관 개체 설정 되어 있는 경우 분기를 실행 합니다. 그렇지 않으면 if arData 설정 됩니다 (수신)을 로드 하기 위한 함수가 사용 하는 다른 분기.Mfc에서 serialization에 대 한 자세한 내용은 참조 하십시오. Serialization.

[!참고]

arAck 아카이브 개체의 반대에 가정 arData.경우 arData 보내는 대 한 arAck 받는 고와 반대의 경우도 마찬가지입니다.

보내기 위한 예제 함수는 지정 된 횟수 만큼 데모용 일부 임의의 데이터를 생성 하는 각 시간에는 반복 됩니다.응용 프로그램 파일과 같은 일부 소스에서 실제 데이터를 얻을 수 있습니다.arData 아카이브의 삽입 연산자 (<<) 세 개의 연속 된 청크 데이터 스트림을 보내는 데 사용 됩니다.

  • "헤더"는 데이터의 특성을 지정 (값의 경우에 bValue 변수 및 매수를 보낼).

    두 항목에 대 한이 예제를 임의로 생성 됩니다.

  • 지정 된 데이터의 복사본 개수입니다.

    내부 에 대 한 보냅니다 루프 bValue 지정 된 횟수입니다.

  • String 이라는 strText 수신기를 해당 사용자에 게 표시 합니다.

보관 파일의 추출 연산자를 사용 하는 점을 제외 하 고 수신의 경우, 함수는 비슷하게 작동 (>>) 보관 저장소에서 데이터를 가져올 수 있습니다.수신 응용 프로그램 표시 하려면 보내는 응용 프로그램에 대 한 수신, 최종 "Received" 메시지를 표시 및 "보낸 날짜" 라는 메시지를 돌려 보냅니다 데이터를 확인 합니다.

이 통신 모델에서는 단어 "Received" 메시지 보낸의 strText 변수가 디스플레이 통신의 다른 끝에 특정 개수의 데이터 패킷 받은 수신 사용자 수를 지정 합니다.수신기는 원래 보낸 사람의 화면에 표시 ", 디스플레이 대 한 전송" 라는 유사한 문자열로 응답 합니다.두 문자열을 받기 통신을 성공적으로 수행 되었음을 나타냅니다.

주의 정보주의

설정 된 (비 MFC) 서버와 통신 하는 MFC 클라이언트 프로그램을 작성 하는 경우 C++ 개체를 보관 저장소를 통해 보내지 마십시오.해당 서버가 보내려는 개체의 종류를 이해 하는 MFC 응용 프로그램 아니면 받고 개체를 deserialize 할 수 없습니다.예제 문서에서 Windows 소켓: 바이트 순서 는 이러한 종류의 통신을 보여 줍니다.

에 대 한 자세한 내용은 Windows 소켓 사양을 참조 하십시오: htonl, htons, ntohl, ntohs.또한, 자세한 내용은 참조 하십시오.

참고 항목

참조

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

개념

Mfc에서 Windows 소켓