本文并排演示了服务器套接字和客户端套接字的作序列。 由于套接字使用 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 |
其中 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
尤其如此。 不应尝试使用 Seek
CSocketFile
。
有关详细信息,请参见:
另请参阅
MFC 中的 Windows 套接字
CSocket 类
CAsyncSocket::Create
CAsyncSocket::Close