本文以对照方式阐释了服务器套接字和客户端套接字的操作顺序. 因为这些套接字使用 CArchive 对象, 所以它们必然是流式套接字. 流式套接字通信的操作顺序
在构造 CSocketFile 对象之前, 下面的顺序对 CAsyncSocket 和 CSocket 都是准确的(只有少数几个参数不同). 从构造 CSocketFile 对象开始, 顺序只适用于 CSocket. 下表阐释了在客户端和服务器之间设置通信的操作顺序.
设置服务器和客户端之间的通信 -
1. 这里的 nPort 是端口号. 有关端口的详细信息, 请参见 Windows Sockets: 端口和套接字地址.
2. 服务器必须始终指定一个端口, 以便客户端可以连接. Create 调用有时也指定地址. 在客户端使用默认参数, 这些参数要求 MFC 使用任何可用端口.
3. 这里的 nPort 是端口号, strAddr 是计算机地址或网际协议 (IP) 地址.
4. 计算机地址可以采用几种形式:"ftp.microsoft.com","microsoft.com".IP 地址采用 "以点分隔的数字" 形式, 如 "127.54.67.32". Connect 函数查看地址是否为以点分隔的数字(但它不确保该数字是网络上的有效计算机). 如果不是, 则 Connect 使用其他某种形式的计算机名称.
5. 当在服务器端调用 Accept 时, 传递对新套接字对象的引用. 必须首先构造该对象, 但不对它调用 Create. 注意, 如果此套接字对象超出范围, 则连接关闭. MFC 将新对象连接到 SOCKET 句柄. 可以在堆栈上构造此套接字 (如表中所示) 或在堆上构造.
6. 存档和套接字文件在超出范围时将被关闭. 套接字对象超出范围或被删除时, 对象的析构函数也对此套接字对象调用 Close 成员函数. 有关顺序的其他说明
上表中显示的调用顺序适用于流式套接字. 数据文报套接字是无连接的, 不需要 CAsyncSocket::Connect,Listen 和 Accept 调用 (但可有选择地使用 Connect). 相反, 如果正在使用 CAsyncSocket 类, 则数据文报套接字使用 CAsyncSocket::SendTo 和 ReceiveFrom 成员函数.(如果对数据文报套接字使用 Connect, 则使用 Send 和 Receive.) 因为 CArchive 不适用于数据文报, 如果套接字是数据文报, 则不要使用带存档的 CSocket.
CSocketFile 并不支持 CFile 的所有功能, CFile 成员 (如 Seek) 对套接字通信没有意义, 是不可用的. 因此, 某些默认 MFC Serialize 函数与 CSocketFile 不兼容. 这对于 CEditView 类更是如此. 不要试图使用 CEditView::SerializeRaw 通过附加到 CSocketFile 对象的 CArchive 对象来序列化 CEditView 数据, 而应使用 CEditView::Serialize(无出处).SerializeRaw 函数预期文件对象具有 CSocketFile 不支持的函数, 如 Seek.
有关更多信息, 请参见: Windows Sockets: 使用带存档的套接字 Windows Sockets: 使用 CAsyncSocket 类 Windows Sockets: 端口和套接字地址 Windows Sockets: 流式套接字 Windows Sockets: 数据文报套接字
来源: http://www.jianshu.com/p/14824f612204