1. IND2Listener接口
用于侦听来自对等点的连接请求。 IND2Adapter::CreateListener方法返回该接口。
IND2Listener接口继承自IND2Overlapped接口。此外,IND2Listener还定义了以下方法:
- Bind-将侦听器对象绑定到本地地址。
- Listen—开始监听传入的连接请求。
- GetLocalAddress- 获取监听对象的地址。
- GetConnectionRequest - 获取挂起连接请求的句柄。
备注:
NetworkDirect使用主动/被动模型来建立对等体之间的连接;被动端侦听来自活动端的连接请求。
活动端进行以下调用:
1)Receive(可以发生在Connect之前或之后)
2)Connect(在对等端调用Accept或Reject拒绝后完成)
3)CompleteConnect
4)Send(开始第一次发送/接收交换)
被动端进行以下调用:
1)GetConnectionRequest(接收连接请求)
2)Receive(post一个请求来接收第一个发送请求)
3)Accept
iWARP规范要求主动端总是在被动端向主动端发出发送请求之前向被动端发起发送请求。在建立连接之后,被动端在从活动端接收到它的第一个消息之前不能发出Send请求。这要求被动端总是发出至少一个Receive请求,并等待它完成后才能开始发出Send请求(即使它在那个时间之后只发出Send请求)。
连接的任何一方都可以通过调用IND2Connector::Disconnect方法来终止连接。当一个队列对断开连接时,所有请求都会被刷新(取消)。对于连接两端所有未完成的Send和Receive请求,完成状态是ND_CANCELED。
NetworkDirect Provider提供商不应该对异步连接建立事件的客户端响应时间做出任何假设,他们应该尽一切努力适应在处理与连接相关的I/O完成时经历延迟的客户端。
2. IND2Listener::Bind接口
HRESULT Bind(
[in] const struct sockaddr *pAddress,
[in] ULONG cbAddress,
);
绑定一个本地地址到监听器上。
- 参数
- pAddress[in]
一个sockaddr缓冲区,它指定用来监听连接请求的本地地址。通常,这是一个sockaddr_in结构的IPv4地址和一个sockaddr_in6结构的IPv6地址。
如果sin_port或sin6_port成员被指定为零,则Provider将为应用程序分配一个惟一的端口号。如果sin_addr或sin6_addr是INADDR_ANY或IN6ADDR_ANY,如果NetworkDirect适配器支持多个IP地址,监听对象可以是多归属的,但不能跨多个NetworkDirect适配器。 - cbAddress[in]
pAddress缓冲区的大小,以字节为单位。
- pAddress[in]
- 返回值
- ND_SUCCESS—操作完成成功。
- ND_SHARING_VIOLATE—指定的地址已经在这个NetworkDirect适配器上使用。
- ND_INSUFFICIENT_RESOURCES -没有足够的资源来完成请求。
- ND_TOO_MANY_ADDRESSES -客户端指定了一个本地端口号为0,并且NetworkDirect提供商无法从临时端口空间(端口49152-65535)分配一个端口。
3. IND2Listener::Listen接口
HRESULT Listen(
[in] ULONG Backlog
);
开始监听连接请求。
- 参数
- Backlog[in]
为侦听请求维护的挂起连接请求的最大数量。设置为0表示无限制。
- Backlog[in]
- 返回值
- ND_SUCCESS—操作完成成功。
- ND_INSUFFICIENT_RESOURCES -没有足够的资源来完成请求。
- 实现须知
NetworkDirect Provider服务提供商可能会限制Backlog的范围,并悄悄施加限制。没有提供检索实际积压值的准备。 - 备注
客户端-服务器应用程序的服务器端侦听来自客户端的连接请求。
4. IND2Listener::GetLocalAddress接口
HRESULT GetLocalAddress(
[out, optional] struct sockaddr *pAddress,
[in, out] ULONG *pcbAddress
);
检索侦听对象的地址,其中包括适配器地址和端口号, listen对象必须正在监听。
-
参数
- pAddress [out, optional]
接收本地监听地址的sockaddr缓冲区。如果pcbAddress为零,可以为nullptr。 - pcbAddress [in, out]
pAddress缓冲区的大小,以字节为单位。如果缓冲区太小,该方法失败返回ND_BUFFER_OVERFLOW,并将此参数设置为所需的缓冲区大小。如果缓冲区太大,该方法将该参数设置为输出时使用的大小。
- pAddress [out, optional]
-
返回值
厂商在实现此方法时,应该支持返回以下值。如果返回其他值,需要明确返回有意义的值来帮助调试问题。- ND_SUCCESS
操作成功。 - ND_BUFFER_OVERFLOW pAddress缓冲区不够大,无法容纳地址,缓冲区没有被修改。使用所需的缓冲区大小更新pcbAddress参数。
- ND_INVALID_DEVICE_STATE
侦听对象没有侦听。
- ND_SUCCESS
5. IND2Listener::GetConnectionRequest
HRESULT GetConnectionRequest(
[in, out] IUnknown *pConnector,
[in, out] OVERLAPPED *pOverlapped
);
查询并获取排队中的连接请求。
-
参数
- pConnector [in, out]
调用IND2Adapter::CreateConnector返回的连接器请求的接口。 - pOverlapped [in, out]
指向OVERLAPPED结构的指针,用于指示操作的完成。
- pConnector [in, out]
-
返回值
厂商在实现此方法时,应返回以下返回值。如果返回其他值,需要使用有意义的值来帮助调试问题。- ND_SUCCESS
操作成功。 - ND_PENDING
请求正在挂起,当侦听对等端接受连接请求时,请求将完成。 - ND_CANCELED
监听请求已关闭。 - ND_DEVICE_REMOVED
底层NetworkDirect适配器已从系统中移除。
- ND_SUCCESS
注意:
可以连续发起多个GetConnectionRequest请求来为将来的连接请求做准备。对于每个待接收的连接请求,OVERLAPPED请求一次完成一个。可以像任何其他重叠操作一样检测重叠请求的完成情况(有关更多信息,请参阅IND2Adapter::CreateOverlappedFile的备注)。
关于作者:
犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等领域)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。
专业方向爱好:数学、科学技术应用
关注犇叔,期望为您带来更多科研领域的知识和产业应用。
内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路。