Windows套接字:套接字的示例使用中的存档
本文存在使用类的示例 CSocket。该示例使用 CArchive 对象通过套接字序列化数据。注意不是为了文档序列化来回文件。
下面的示例演示如何使用中的存档通过 CSocket 对象发送和接收数据。示例设计,以便应用程序 (在同一台计算机或网络上不同的计算机) 交换数据的两个实例。一个实例发送数据,另一个实例接收和识别。任何应用程序可以启动替换,并且,要么可以作为服务器或客户端到其他应用程序。以下功能在应用程序的视图类中定义:
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 引用作为参数: arData 和 arAck。如果 arData 存档对象用于存储 (发送) 设置, if 分支执行;否则,因此,如果 arData 用于加载 (接收) 设置函数采用 else 分支。有关 MFC 中序列化的更多信息,请参见 序列化。
说明 |
---|
arAck 存档对象假定为 arData相反。如果 arData 用于发送, arAck 接收,并且,并为 true。 |
为发送,将示例函数 for 循环,每次生成一些随机数据的指定次数演示目的。您的应用程序将从某一源的实际数据,如文件。arData 存档的插入运算符 (<<) 用于发送数据这三个连续的区块流:
指定数据的性质的 “标题” (在本例中,变量的 bValue 的值,并且多少个副本的发送)。
两个项目用于此示例随机生成。
数据的副本指定的数目。
内部 for 循环发送 bValue 指定的次数。
字符串调用接收方显示给其用户的 strText 。
用于接收,该功能类似运行,除此之外,使用从存档的存档的提取运算符 (>>) 获取数据。它接收的接收方应用程序来验证数据,显示最终 “接收的”消息,然后回显示 “发送”为了发送的应用程序中显示的消息。
中的通信模型, “接收的”单词,在 strText 变量发送的信息,用于显示在窗体通信的另一端,因此,它指定给接收的用户许多的数据包接收。接收方答复与指出 “发送”的相似字符串,原始发送方的屏幕显示的。两个字符串的收货指示成功的通信发生。
警告 |
---|
如果正在编写一个 MFC 客户端程序与已建立的 (非 MFC) 服务器通信,不要将存档发送 C++ 对象。除非服务器是了解该对象的 MFC 应用程序要发送,无法接收和反序列化您的对象。一个示例对这篇文章 Windows 套接字:字节顺序 中显示此类型的通信。 |
有关更多信息,请参见 Windows 套接字规范: htonl, htons, ntohl, ntohs。此外,有关更多信息,请参见: