Windows 套接字:作序列

本文并排演示了服务器套接字和客户端套接字的作序列。 由于套接字使用 CArchive 对象,因此它们必然是 流式传输套接字

流套接字通信的作序列

在构造 CSocketFile 对象时,以下序列对于两者 CAsyncSocket 都有一些参数差异,并且 CSocket是准确的。 从那一点开始,序列是严格针对的 CSocket。 下表说明了用于设置客户端与服务器之间的通信的作序列。

设置服务器与客户端之间的通信

服务器 客户
// construct a socket

CSocket sockSrvr;
// construct a socket

CSocket sockClient;
// create the SOCKET

sockSrvr.Create(nPort);1,2
// create the SOCKET

sockClient.Create( );2
// start listening

sockSrvr.Listen( );
// seek a connection

sockClient.Connect(strAddr, nPort);3,4
// construct a new, empty socket

CSocket sockRecv;

// accept connection

sockSrvr.Accept( sockRecv ); 5
// construct file object

CSocketFile file(&sockRecv);
// construct file object

CSocketFile file(&sockClient);
// construct an archive

CArchive arIn(&file, CArchive::load);

-或-

CArchive arOut(&file, CArchive::store);

- 或两者 -
// construct an archive

CArchive arIn(&file, CArchive::load);

-或-

CArchive arOut(&file, CArchive::store);

- 或两者 -
// use the archive to pass data:

arIn >> dwValue;

-或-

arOut << dwValue;6
// use the archive to pass data:

arIn >> dwValue;

-或-

arOut << dwValue;6
  1. 其中 nPort 是端口号。 有关端口的详细信息 ,请参阅 Windows 套接字:端口和套接字地址

  2. 服务器必须始终指定端口,以便客户端可以连接。 调用 Create 有时还指定地址。 在客户端,使用默认参数,要求 MFC 使用任何可用端口。

  3. 其中 nPort 是端口号, strAddr 是计算机地址或 Internet 协议 (IP) 地址。

  4. 计算机地址可以采用多种形式:“ftp.microsoft.com”、“microsoft.com”。 IP 地址使用“点数字”格式“127.54.67.32”。 该 Connect 函数检查地址是否为点号(尽管它不检查以确保该号码是网络上的有效计算机)。 如果没有, Connect 则假定计算机名称为其他窗体之一。

  5. 在服务器端调用 Accept 时,将引用传递给新的套接字对象。 必须首先构造此对象,但不要为其调用 Create 。 请记住,如果此套接字对象超出范围,则会关闭连接。 MFC 将新对象连接到 SOCKET 句柄。 可以在堆栈上构造套接字,如上所示,也可以在堆上构造套接字。

  6. 存档文件和套接字文件在超出范围时关闭。 当对象超出范围或删除时,套接字对象的析构函数也会调用套接字对象的 Close 成员函数。

有关序列的其他说明

上表中所示的调用序列适用于流套接字。 数据报套接字(无连接)不需要 CAsyncSocket::Connect侦听接受 调用(尽管可以选择使用 Connect)。 相反,如果使用类 CAsyncSocket,则数据报套接字使用 CAsyncSocket::SendToReceiveFrom 成员函数。 (如果与 Connect 数据报套接字一起使用,则使用 SendReceive.)由于 CArchive 不适用于数据报,因此如果套接字是数据报,请不要与 CSocket 存档一起使用。

CSocketFile 不支持所有 CFile功能; CFile 对于 Seek套接字通信没有意义的成员不可用。 因此,某些默认 MFC Serialize 函数不兼容 CSocketFile。 这在类中 CEditView 尤其如此。 不应尝试使用 /> 通过附加到对象的对象序列化数据;请改用(未记录)。 SerializeRaw 函数要求文件对象具有不支持的函数,例如SeekCSocketFile

有关详细信息,请参见:

另请参阅

MFC 中的 Windows 套接字
CSocket 类
CAsyncSocket::Create
CAsyncSocket::Close