nl::Inet::TCPEndPoint

#include <src/inet/TCPEndPoint.h>

此类的对象表示 TCP 传输端点。

摘要

Nest Inet 层封装了与 TCP 传输端点(Linux 和 BSD 衍生系统上的 SOCK_STREAM 套接字)或 LwIP TCP 协议控制块进行交互的方法(如果系统进行了相应配置)。

继承

沿用自: nl::Inet::EndPointBasis

公共类型

@10{
  kState_Ready = kBasisState_Closed,
  kState_Bound = 1,
  kState_Listening = 2,
  kState_Connecting = 3,
  kState_Connected = 4,
  kState_SendShutdown = 5,
  kState_ReceiveShutdown = 6,
  kState_Closing = 7,
  kState_Closed = 8
}
枚举
底层端点的基本动态状态。
OnAcceptErrorFunct)(TCPEndPoint *endPoint, INET_ERROR err) typedef
void(*
连接接受错误事件处理函数的类型。
OnConnectCompleteFunct)(TCPEndPoint *endPoint, INET_ERROR err) typedef
void(*
连接建立事件处理函数的类型。
OnConnectionClosedFunct)(TCPEndPoint *endPoint, INET_ERROR err) typedef
void(*
连接建立事件处理函数的类型。
OnConnectionReceivedFunct)(TCPEndPoint *listeningEndPoint, TCPEndPoint *conEndPoint, const IPAddress &peerAddr, uint16_t peerPort) typedef
void(*
连接接收事件处理函数的类型。
OnDataReceivedFunct)(TCPEndPoint *endPoint, Weave::System::PacketBuffer *data) typedef
void(*
数据接收事件处理函数的类型。
OnDataSentFunct)(TCPEndPoint *endPoint, uint16_t len) typedef
void(*
数据传输事件处理函数的类型。
OnPeerCloseFunct)(TCPEndPoint *endPoint) typedef
void(*
半关闭接收事件处理函数的类型。
OnTCPSendIdleChangedFunct)(TCPEndPoint *endPoint, bool isIdle) typedef
void(*
TCP SendIdle 更改的信号处理函数的类型。

公共属性

OnAcceptError
端点的连接接受事件处理函数委托。
OnConnectComplete
端点的连接建立事件处理函数委托。
OnConnectionClosed
端点的关闭事件处理函数委托。
OnConnectionReceived
端点的连接接收事件处理函数委托。
OnDataReceived
端点的消息文本接收事件处理函数委托。
OnDataSent
端点的消息文本传输事件处理函数委托。
OnPeerClose
端点的半关闭接收事件处理函数委托。
OnTCPSendIdleChanged
当 TCP 连接的发送通道的空闲状态发生变化时,端点的事件处理函数委托会发出信号。
ReceiveEnabled
bool
用于指示应用是否在接收数据的控制开关。
State
enum nl::Inet::TCPEndPoint::@10
底层端点的基本动态状态。

公共函数

Abort(void)
void
中止端点,即发送 RST 数据包。
AckReceive(uint16_t len)
确认收到消息文本。
Bind(IPAddressType addrType, IPAddress addr, uint16_t port, bool reuseAddr)
将端点绑定到接口 IP 地址。
Close(void)
发起 TCP 完全关闭,也就是在发送和接收过程中完成。
Connect(IPAddress addr, uint16_t port, InterfaceId intf)
启动 TCP 连接。
DisableKeepAlive(void)
停用 TCP“保持连接”选项。
DisableReceive(void)
void
停用接收。
EnableKeepAlive(uint16_t interval, uint16_t timeoutCount)
启用 TCP“keep-alive”选项。
EnableNoDelay(void)
EnableNoDelay。
EnableReceive(void)
void
启用接收。
Free(void)
void
启动(或继续)TCP 完全关闭,忽略错误。
GetLocalInfo(IPAddress *retAddr, uint16_t *retPort)
提取本地端点的 IP 地址和 TCP 端口。
GetPeerInfo(IPAddress *retAddr, uint16_t *retPort) const
提取远程端点的 IP 地址和 TCP 端口。
IsConnected(void) const
bool
了解是否已建立 TCP 连接。
Listen(uint16_t backlog)
准备端点以接收 TCP 消息。
LogId(void)
uint16_t
获取端点的标识符。
MarkActive(void)
void
记录活动,换句话说,重置空闲计时器。
PendingReceiveLength(void)
uint32_t
提取未确认的接收数据的长度。
PendingSendLength(void)
uint32_t
提取等待首次传输的数据的长度。
PutBackReceivedData(Weave::System::PacketBuffer *data)
将消息文本推送回接收队列的开头。
Send(Weave::System::PacketBuffer *data, bool push)
使用 TCP 连接时发送消息文本。
SetConnectTimeout(const uint32_t connTimeoutMsecs)
void
设置超时,以便连接成功或返回错误。
SetUserTimeout(uint32_t userTimeoutMillis)
设置 TCP TCP_USER_TIMEOUT 套接字选项。
Shutdown(void)
发起 TCP 半关闭操作,即完成发送。

公共类型

@10

 @10

底层端点的基本动态状态。

对象在“ready”状态,则继续进行与 TCP 传输状态机状态简化对应的后续状态。

注意:由于历史二进制文件兼容性的原因,kBasisState_Closed 状态枚举会映射到 kState_Ready。现有 kState_Closed 的存在是为了单独标识“尚未打开”和“尚未打开”之间的区别以及“之前现在打开过” 已关闭”之前处于 kState_ReadykState_Closed 状态。

属性
kState_Bound

已绑定端点,但未监听。

kState_Closed

端点已关闭,准备发布。

kState_Closing

端点双向关闭。

kState_Connected

端点已连接,已准备好进行 tx/rx。

kState_Connecting

尝试连接的端点。

kState_Listening

接收连接的端点。

kState_Ready

端点已初始化,但未绑定。

kState_ReceiveShutdown

端点响应半关闭。

kState_SendShutdown

端点已启动半闭合。

OnAcceptErrorFunct

void(* OnAcceptErrorFunct)(TCPEndPoint *endPoint, INET_ERROR err)

连接接受错误事件处理函数的类型。

OnAcceptError 委托成员提供此类型的函数,以处理 endPoint 上的连接接受错误事件。err 参数提供有关错误类型的具体详细信息。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] err
错误的原因。

OnConnectCompleteFunct

void(* OnConnectCompleteFunct)(TCPEndPoint *endPoint, INET_ERROR err)

连接建立事件处理函数的类型。

OnConnectComplete 委托成员提供此类型的函数,以处理 endPoint 上的连接建立事件。err 参数用于区分连接成功与失败。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] err
如果成功,则为 INET_NO_ERROR,否则为另一个代码。

OnConnectionClosedFunct

void(* OnConnectionClosedFunct)(TCPEndPoint *endPoint, INET_ERROR err)

连接建立事件处理函数的类型。

OnConnectionClosed 委托成员提供此类型的函数,以处理 endPoint 上的连接终止事件。err 参数用于区分成功终止与失败。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] err
如果成功,则为 INET_NO_ERROR,否则为另一个代码。

OnConnectionReceivedFunct

void(* OnConnectionReceivedFunct)(TCPEndPoint *listeningEndPoint, TCPEndPoint *conEndPoint, const IPAddress &peerAddr, uint16_t peerPort)

连接接收事件处理函数的类型。

OnConnectionReceived 委托成员提供此类型的函数,以处理 listeningEndPoint 上的连接接收事件。新收到的端点 conEndPoint 位于 IP 地址 peerAddr 和 TCP 端口 peerPort

详细信息
参数
[in] listeningEndPoint
监听 TCP 端点。
[in] conEndPoint
新接收的 TCP 端点。
[in] peerAddr
远程对等方的 IP 地址。
[in] peerPort
远程对等方的 TCP 端口。

OnDataReceivedFunct

void(* OnDataReceivedFunct)(TCPEndPoint *endPoint, Weave::System::PacketBuffer *data)

数据接收事件处理函数的类型。

OnDataReceived 委托成员提供此类型的函数,以处理 endPoint 上的数据接收事件,其中 data 是收到的消息文本。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] data
收到的数据。

数据接收事件处理脚本必须确认使用 AckReceive 方法处理的数据。除非改用 PutBackReceivedData,否则还必须对数据缓冲区调用 Free 方法。

OnDataSentFunct

void(* OnDataSentFunct)(TCPEndPoint *endPoint, uint16_t len)

数据传输事件处理函数的类型。

OnDataSent 委托成员提供此类型的函数,以处理 endPoint 上的数据传输事件,其中 len 是添加到 TCP 传输窗口的消息文本的长度,可以由底层网络堆栈发送。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] len
添加到传输窗口的字节数。

OnPeerCloseFunct

void(* OnPeerCloseFunct)(TCPEndPoint *endPoint)

半关闭接收事件处理函数的类型。

OnPeerClose 委托成员提供此类型的函数,以处理 endPoint 上的连接终止事件。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。

OnTCPSendIdleChangedFunct

void(* OnTCPSendIdleChangedFunct)(TCPEndPoint *endPoint, bool isIdle)

TCP SendIdle 更改的信号处理函数的类型。

OnTCPSendIdleChanged 委托成员提供此类型的函数,以处理 TCPEndPoint 的发送通道在空闲和非空闲状态之间变化的事件。

详细信息
参数
[in] endPoint
与事件关联的 TCP 端点。
[in] isIdle
如果 TCP 端点的发送通道为空闲,则为 true,否则为 false。

公共属性

OnAcceptError

OnAcceptErrorFunct OnAcceptError

端点的连接接受事件处理函数委托。

OnConnectComplete

OnConnectCompleteFunct OnConnectComplete

端点的连接建立事件处理函数委托。

OnConnectionClosed

OnConnectionClosedFunct OnConnectionClosed

端点的关闭事件处理函数委托。

OnConnectionReceived

OnConnectionReceivedFunct OnConnectionReceived

端点的连接接收事件处理函数委托。

OnDataReceived

OnDataReceivedFunct OnDataReceived

端点的消息文本接收事件处理函数委托。

OnDataSent

OnDataSentFunct OnDataSent

端点的消息文本传输事件处理函数委托。

OnPeerClose

OnPeerCloseFunct OnPeerClose

端点的半关闭接收事件处理函数委托。

OnTCPSendIdleChanged

OnTCPSendIdleChangedFunct OnTCPSendIdleChanged

当 TCP 连接的发送通道的空闲状态发生变化时,端点的事件处理函数委托会发出信号。

上层利用此功能,根据发送的数据是否已可靠地传送到对等端,采取适当的操作。

ReceiveEnabled

bool ReceiveEnabled

用于指示应用是否在接收数据的控制开关。

enum nl::Inet::TCPEndPoint::@10 State

底层端点的基本动态状态。

对象在“ready”状态,则继续进行与 TCP 传输状态机状态简化对应的后续状态。

注意:由于历史二进制文件兼容性的原因,kBasisState_Closed 状态枚举会映射到 kState_Ready。现有 kState_Closed 的存在是为了单独标识“尚未打开”和“尚未打开”之间的区别以及“之前现在打开过” 已关闭”之前处于 kState_ReadykState_Closed 状态。

公共函数

中止

void Abort(
  void
)

中止端点,即发送 RST 数据包。

AckReceive

INET_ERROR AckReceive(
  uint16_t len
)

确认收到消息文本。

使用此方法确认已接收全部或部分数据。如果 len 大于未完成的未确认已接收数据总量,则操作语义未定义。

详细信息
参数
[in] len
要确认的字节数。
返回值
INET_NO_ERROR
success: 收到确认。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
INET_ERROR_CONNECTION_ABORTED
TCP 连接不再打开。

绑定

INET_ERROR Bind(
  IPAddressType addrType,
  IPAddress addr,
  uint16_t port,
  bool reuseAddr
)

将端点绑定到接口 IP 地址。

将端点绑定到指定的网络接口 IP 地址。

详细信息
参数
[in] addrType
IP 地址的协议版本
[in] addr
IP 地址(必须是接口地址)
[in] port
TCP 端口
[in] reuseAddr
与其他端点共享绑定的选项
返回值
INET_NO_ERROR
成功:端点已绑定到地址
INET_ERROR_INCORRECT_STATE
端点之前
INET_NO_MEMORY
端点内存不足
INET_ERROR_WRONG_PROTOCOL_TYPE
addrTypeIPVer 不匹配。
INET_ERROR_WRONG_ADDRESS_TYPE
addrTypekIPAddressType_Any,或者 addr 的类型不等于 addrType
other
其他系统或平台错误

在 LwIP 上,不得使用已获取的 LwIP 堆栈锁调用此方法。

关闭

INET_ERROR Close(
  void
)

发起 TCP 完全关闭,也就是在发送和接收过程中完成。

详细信息
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
other
其他系统或平台错误

交流

INET_ERROR Connect(
  IPAddress addr,
  uint16_t port,
  InterfaceId intf
)

启动 TCP 连接。

 If possible, then this method initiates a TCP connection to the
 destination \c addr (with \c intf used as the scope
 identifier for IPv6 link-local destinations) and \c port.

详细信息
参数
[in] addr
目标 IP 地址
[in] port
目标 TCP 端口
[in] intf
可选的网络接口指示器
返回值
INET_NO_ERROR
成功:msg 已加入传输队列。
INET_ERROR_NOT_IMPLEMENTED
系统实现未完成。
INET_ERROR_WRONG_ADDRESS_TYPE
目标地址和绑定的接口地址没有匹配的协议版本或地址类型,或者目标地址是 IPv6 链路本地地址且未指定 intf
other
其他系统或平台错误

DisableKeepAlive

INET_ERROR DisableKeepAlive(
  void
)

停用 TCP“保持连接”选项。

TCPEndPoint::DisableKeepAlive.

在关联的 TCP 连接上停用 TCP keepalive 探测。

详细信息
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
INET_ERROR_CONNECTION_ABORTED
TCP 连接不再打开。
INET_ERROR_NOT_IMPLEMENTED
系统实现未完成。
other
其他系统或平台错误

注意:只有当端点处于某种连接状态时,才能调用此方法。 如果端点上未启用 keepalive,此方法不会执行任何操作。

DisableReceive

void DisableReceive(
  void
)

停用接收。

停用所有事件处理脚本。发送到禁用接收的端点的数据将得到确认,直到接收窗口用尽。

EnableKeepAlive

INET_ERROR EnableKeepAlive(
  uint16_t interval,
  uint16_t timeoutCount
)

启用 TCP“keep-alive”选项。

TCPEndPoint::EnableKeepAlive.

开始自动传输 TCP“保持连接”每 interval 秒检测一次探测段。在收到否定响应后,或发送了 timeoutCount 个探测段而没有收到肯定响应后,连接将自动取消。

详细信息
参数
[in] interval
两次探测请求之间的时间间隔(以秒为单位)。
[in] timeoutCount
在超时前发送的探测次数。
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
INET_ERROR_CONNECTION_ABORTED
TCP 连接不再打开。
INET_ERROR_NOT_IMPLEMENTED
系统实现未完成。
other
其他系统或平台错误

有关规范详情,请参阅 RFC 1122 第 4.2.3.6 节。

在关联的 TCP 连接上启用 TCP keepalive 探测。

注意:只有当端点处于某种连接状态时,才能调用此方法。 可以多次调用此方法来调整 keepalive 间隔或超时计数。

详细信息
参数
interval
keepalive 探测之间的时间间隔(以秒为单位)。此值还可控制从发送上一个数据包到传输第一个 keepalive 探测所间隔的时间。
timeoutCount
视为连接失败之前未确认的探测次数上限。

EnableNoDelay

INET_ERROR EnableNoDelay(
  void
)

EnableNoDelay。

TCPEndPoint::EnableNoDelay

通过设置 TCP_NODELAY 套接字选项,关闭 TCP 中的 nagle 缓冲算法。

EnableReceive

void EnableReceive(
  void
)

启用接收。

启用所有事件处理脚本。发送到禁用接收的端点的数据将得到确认,直到接收窗口用尽。

免费

void Free(
  void
)

启动(或继续)TCP 完全关闭,忽略错误。

对象会返回免费池,之后所有剩余的用户引用都将无效。

GetLocalInfo

INET_ERROR GetLocalInfo(
  IPAddress *retAddr,
  uint16_t *retPort
)

提取本地端点的 IP 地址和 TCP 端口。

不要对其中任一参数使用 NULL 指针值。

详细信息
参数
[out] retAddr
本地端点的 IP 地址。
[out] retPort
本地端点的 TCP 端口。
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
INET_ERROR_CONNECTION_ABORTED
TCP 连接不再打开。

GetPeerInfo

INET_ERROR GetPeerInfo(
  IPAddress *retAddr,
  uint16_t *retPort
) const 

提取远程端点的 IP 地址和 TCP 端口。

不要对其中任一参数使用 NULL 指针值。

详细信息
参数
[out] retAddr
远程端点的 IP 地址。
[out] retPort
远程端点的 TCP 端口。
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
INET_ERROR_CONNECTION_ABORTED
TCP 连接不再打开。

IsConnected

bool IsConnected(
  void
) const 

了解是否已建立 TCP 连接。

收听

INET_ERROR Listen(
  uint16_t backlog
)

准备端点以接收 TCP 消息。

如果 State 已经为 kState_Listening,则不执行任何操作,否则 State 会设置为 kState_Listening,并且端点会根据平台的语义准备好接收 TCP 消息。

详细信息
参数
[in] backlog
连接接受队列的最大深度
返回值
INET_NO_ERROR
成功:端点已准备好接收消息。
INET_ERROR_INCORRECT_STATE
端点已在监听

在某些平台上,不使用 backlog 参数(队列深度是固定的;一次只接受一个连接)。

在 LwIP 系统中,不得使用已获取的 LwIP 堆栈锁调用此方法

LogId

uint16_t LogId(
  void
)

获取端点的标识符。

详细信息
返回值
返回使用日志的不透明唯一标识符。

MarkActive

void MarkActive(
  void
)

记录活动,换句话说,重置空闲计时器。

将闲置计时器重置为零。

PendingReceiveLength

uint32_t PendingReceiveLength(
  void
)

提取未确认的接收数据的长度。

详细信息
返回值
接收队列中尚未通过 AckReceive(uint16_t len) 确认的字节数。

PendingSendLength

uint32_t PendingSendLength(
  void
)

提取等待首次传输的数据的长度。

详细信息
返回值
传输队列中未传输的字节数。

PutBackReceivedData

INET_ERROR PutBackReceivedData(
  Weave::System::PacketBuffer *data
)

将消息文本推送回接收队列的开头。

此方法只能由数据接收事件处理程序调用,以便将未确认的数据部分放回接收队列中。如果调用方在数据接收事件处理程序的范围之外,data 不是提供给处理程序的 Weave::System::PacketBuffer,或者 data 不包含在之前调用 AckReceive(uint16_t len) 方法已确认的字节之后剩余的未确认部分,则操作语义未定义。

详细信息
参数
[out] data
要推送的消息文本。
返回值
INET_NO_ERROR
success: 收到确认。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。

发送

INET_ERROR Send(
  Weave::System::PacketBuffer *data,
  bool push
)

使用 TCP 连接时发送消息文本。

无论传输成功还是失败,都会对 data 参数调用 Weave::System::PacketBuffer::Free 方法。

详细信息
参数
[out] data
要发送的消息文字。
[out] push
如果为 true,则立即发送,否则加入队列。
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。

SetConnectTimeout

void SetConnectTimeout(
  const uint32_t connTimeoutMsecs
)

设置超时,以便连接成功或返回错误。

详细信息
参数
[in] connTimeoutMsecs

SetUserTimeout

INET_ERROR SetUserTimeout(
  uint32_t userTimeoutMillis
)

设置 TCP TCP_USER_TIMEOUT 套接字选项。

TCPEndPoint::SetUserTimeout 将用户超时。

当值大于 0 时,它指定了在 TCP 强制关闭相应连接之前传输的数据可以保持未确认状态的最长时间(以毫秒为单位)。如果选项值指定为 0,TCP 将使用系统默认值。如需了解更多详情,请参阅 RFC 5482。

详细信息
参数
[in] userTimeoutMillis
TCP 用户超时值(以毫秒为单位)。
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_NOT_IMPLEMENTED
系统实现未完成。
other
其他系统或平台错误

设置 TCP 用户超时套接字选项。

当该值大于 0 时,它指定了在 TCP 强制关闭相应连接之前传输的数据可以保持未确认状态的最长时间(以毫秒为单位)。如果选项值指定为 0,TCP 将使用系统默认值。如需了解更多详情,请参阅 RFC 5482。

注意:只有当端点处于某种连接状态时,才能调用此方法。 可以多次调用此方法来调整 keepalive 间隔或超时计数。

关停

INET_ERROR Shutdown(
  void
)

发起 TCP 半关闭操作,即完成发送。

详细信息
返回值
INET_NO_ERROR
成功:已提取地址和端口。
INET_ERROR_INCORRECT_STATE
未建立 TCP 连接。
other
其他系统或平台错误