Поделиться через


Windows sockets: Пример сокетов использование файлов

В этой статье представлен пример класса CSocket использования.В этом примере используется объекты CArchive для сериализации данных через сокет.Обратите внимание, что это не сериализации документа или из файла.

В следующем примере показано, как используется архив отправлять и получать данные по объектам CSocket.Был разработан примере для экземпляра (2 описан обмен изменениями данных приложения на том же компьютере или на разных компьютерах в сети).Один экземпляр отправляет данные, которые еще один экземпляр получает и проверить.Любое приложение может начать обмен и может действовать в качестве сервера или клиента в другое приложение.Следующая функция определена в классе представления приложения:

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 состоит из выписки if с предложением else.Функция возвращает 2 CArchive в качестве параметров ссылки: arData и arAck.Если объект arData набор архива для хранения (текст), то выполняется ветвление if; в противном случае, если arData набор для загрузки (get) функция принимает else ветвление.Дополнительные сведения о сериализации в MFC см. в разделе Сериализация.

ПримечаниеПримечание

Предполагается, что объект архива arAck противоположностью arData.Если arData для отправки, то arAck возвращает и converse значение true.

Для отправки, функция примера отсекает цикла для указанного числа раз и каждый раз при создании некоторые случайные данные для демонстрационных целей.Приложение получило бы реальные данные из нескольких источников, например файл.Используется оператор вставки архива arData (<<) отправить поток 3 последующих блоков данных:

  • «Заголовок», определяющих природу данных (в этом случае значение переменных bValue и отправляются количество копий).

    Оба элемента создаются случайным образом для этого примера.

  • Указанное количество копий данных.

    Внутренний цикл for отправляет bValue заданное количество раз.

  • Строка вызвавшей strText разделах дисплеями приемников до ее пользователя.

Для получения функция работает аналогично, за исключением того, что она используется оператор извлечения архива (>>) для получения данных из архива.Принимающее приложение проверяет данные он возвращает окончательное «отображает сообщение получено», а затем отправляет сообщение отправляется обратно «,» для отправляющего приложения отображения.

В этом сообщения, «модели» слово, полученное сообщение, отправленное в переменной strText, для отображения на другом конце сообщений, поэтому он определяет принимающему пользователю, что были получены указанное число пакетов данных.Получатель отвечает с аналогичной строкой, которая сообщает «отправляется», для отображения на экране исходной отправителя.Приходная накладная обеих строк указывает на успешное сообщение.

Предупреждающее замечаниеВнимание

При написании клиентской программы MFC для взаимодействия с заданы несовместимые с mfc servers (), не отправить через объекты C++ в архиве.Если сервер не сможет приложение MFC, который понимает типы объектов требуется отправить, оно не будет получать и выполнять десериализацию объекты.Пример в статье Windows sockets: Порядок байтов отображает сообщение этого типа.

Дополнительные сведения см. в разделе спецификация Windows sockets: htonl, htons, ntohl, ntohs.Кроме того, дополнительные сведения см. в разделах:

См. также

Ссылки

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Основные понятия

Windows sockets в MFC