本文并排演示了服务器套接字和客户端套接字的作序列。 由于套接字使用 CArchive 对象,因此它们必然是 流式传输套接字。
流套接字通信的作序列
在构造 CSocketFile 对象时,以下序列对于两者 CAsyncSocket 都有一些参数差异,并且 CSocket是准确的。 从那一点开始,序列是严格针对的 CSocket。 下表说明了用于设置客户端与服务器之间的通信的作序列。
设置服务器与客户端之间的通信
| 服务器 | 客户 |
|---|---|
// construct a socketCSocket sockSrvr; |
// construct a socketCSocket sockClient; |
// create the SOCKETsockSrvr.Create(nPort);1,2 |
// create the SOCKETsockClient.Create( );2 |
// start listeningsockSrvr.Listen( ); |
|
// seek a connectionsockClient.Connect(strAddr, nPort);3,4 |
|
// construct a new, empty socketCSocket sockRecv;// accept connectionsockSrvr.Accept( sockRecv ); 5 |
|
// construct file objectCSocketFile file(&sockRecv); |
// construct file objectCSocketFile file(&sockClient); |
// construct an archiveCArchive arIn(&file, CArchive::load);-或- CArchive arOut(&file, CArchive::store);- 或两者 - |
// construct an archiveCArchive 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 |
其中 nPort 是端口号。 有关端口的详细信息 ,请参阅 Windows 套接字:端口和套接字地址 。
服务器必须始终指定端口,以便客户端可以连接。 调用
Create有时还指定地址。 在客户端,使用默认参数,要求 MFC 使用任何可用端口。其中 nPort 是端口号, strAddr 是计算机地址或 Internet 协议 (IP) 地址。
计算机地址可以采用多种形式:“ftp.microsoft.com”、“microsoft.com”。 IP 地址使用“点数字”格式“127.54.67.32”。 该
Connect函数检查地址是否为点号(尽管它不检查以确保该号码是网络上的有效计算机)。 如果没有,Connect则假定计算机名称为其他窗体之一。在服务器端调用
Accept时,将引用传递给新的套接字对象。 必须首先构造此对象,但不要为其调用Create。 请记住,如果此套接字对象超出范围,则会关闭连接。 MFC 将新对象连接到 SOCKET 句柄。 可以在堆栈上构造套接字,如上所示,也可以在堆上构造套接字。存档文件和套接字文件在超出范围时关闭。 当对象超出范围或删除时,套接字对象的析构函数也会调用套接字对象的 Close 成员函数。
有关序列的其他说明
上表中所示的调用序列适用于流套接字。 数据报套接字(无连接)不需要 CAsyncSocket::Connect、 侦听和 接受 调用(尽管可以选择使用 Connect)。 相反,如果使用类 CAsyncSocket,则数据报套接字使用 CAsyncSocket::SendTo 和 ReceiveFrom 成员函数。 (如果与 Connect 数据报套接字一起使用,则使用 Send 和 Receive.)由于 CArchive 不适用于数据报,因此如果套接字是数据报,请不要与 CSocket 存档一起使用。
CSocketFile 不支持所有 CFile功能; CFile 对于 Seek套接字通信没有意义的成员不可用。 因此,某些默认 MFC Serialize 函数不兼容 CSocketFile。 这在类中 CEditView 尤其如此。 不应尝试使用 SeekCSocketFile。
有关详细信息,请参见:
另请参阅
MFC 中的 Windows 套接字
CSocket 类
CAsyncSocket::Create
CAsyncSocket::Close