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.Кроме того, дополнительные сведения см. в разделах: