KRTS 高速以太网:网络模块套接字 API

高速以太网:网络模块套接字 API



Socket模块基于Packet模块,实时提供更高的协议,如RAW-IP、TCP 和 UDP(参见 以太网)。

打开套接字

在打开套接字之前,必须打开适配器。有关详细信息(请参阅高速以太网:网络模块)。

要创建新套接字,可以使用函数 KS_openSocket。作为参数,套接字句柄、适配器句柄、结构 KSSocketAddr、协议和标志被传递。调用函数后,将返回套接字句柄。

使用结构 KSSocketAddr 可以传递协议版本、端口和 IP 地址。可以使用函数 KS_makeIPv4 创建有效的 IPv4 地址。

对于原始 IP、UDP 或 TCP,协议可以是"KS_PROTOCOL_RAW"、“KS_PROTOCOL_UDP"或"KS_PROTOCOL_TCP”。

对于 UDP 或 TCP 套接字,可以使用标志"KSF_CLIENT"或"KSF_SERVER"来指定套接字的角色。

关闭套接字

要关闭套接字,必须使用函数 KS_closeSocket

无连接发送和接收

如果是原始 IP 套接字或 UDP 套接字,则套接字是无连接的,即可以通过函数 KS_recvFromSocketKS_sendToSocket 立即接收或发送数据。

函数"KS_recvFromSocket"从 UDP/IP 套接字接收数据。作为参数,套接字句柄、结构 KSSocketAddr、缓冲区、缓冲区的大小(以字节为单位)、所需的缓冲区大小和标志将被传递。参数 pLength 返回接收消息所需的字节数。如果缓冲区较小,则返回错误"KSERROR_NOT_ENOUGH_MEMORY"。用户有机会传递正确大小 pLength 的缓冲区。参数 pSourceAddr 是类型为"KSSocketAddr"的用户分配结构,必须包含发送方的地址。

函数"KS_sendToSocket"通过 UDP/IP 套接字发送数据。作为参数,套接字句柄、结构 KSSocketAddr、缓冲区、长度、缓冲区的大小(以字节为单位)、实际发送的大小(以字节为单位)以及传递的标志。目标地址在参数 pTargetAddr 中给出。缓冲区必须包含要发送的数据。

通过连接发送和接收

对于 TCP 协议,必须先建立连接,然后才能发送数据包。使用 KS_openSocket 创建 TCP 服务器后,服务器会立即进入状态 LISTEN。对于 TCP 客户端,必须调用函数 KS_connectSocket 才能连接到服务器。TCP 服务器获取客户端的地址,并且必须调用函数 KS_acceptSocket

建立TCP连接后,可以通过函数KS_recvSocketKS_sendSocket接收或发送数据。

函数 ‘KS_connectSocket’ 具有客户端套接字句柄、结构 KSSocketAddr 和作为参数的标志。调用此函数时,给定的客户端套接字尝试使用参数 pServerAddr 中给定的 IP 地址连接到服务器套接字。在服务器响应请求之前,这些函数会阻塞。如果设置了标志"KSF_DONT_WAIT",则函数不会阻塞。如果再次调用"KS_connectSocket",但服务器仍然没有应答,则返回错误"KSERROR_OPERATION_PENDING"。

如果调用函数"KS_acceptSocket",服务器将等待传入连接。作为服务器套接字句柄的参数,将传递结构"KSSocketAddr"和标志。如果连接已存在,则该函数将立即返回。否则,当前线程将阻塞,直到客户端与服务器建立连接或套接字关闭。

如果设置了标志"KSF_DONT_WAIT",则函数不会阻塞。如果再次调用"KS_acceptSocket",但仍然没有传入连接,则返回错误"KSERROR_OPERATION_PENDING"。

返回时,有关已连接客户端套接字的信息(例如其 IP 地址和端口号)在参数 pClientAddr 中可用。

函数"KS_recvSocket"从 TCP 套接字接收数据。作为参数,套接字句柄、缓冲区的大小(以字节为单位)、接收消息所需的大小(以字节为单位)和标志都被传递。参数 pLength 返回所需的实际缓冲区大小。如果缓冲区较小,则函数返回错误"KSERROR_NOT_ENOUGH_MEMORY"。函数 ‘KS_recvSocket’ 也可用于获取缓冲区实际需要的大小。

// ...  
int length = 0;  
ksError = KS_recvSocket(hSocket, NULL, 0, &length, 0);  
if (KSERROR_CODE(ksError) != KSERROR_NOT_ENOUGH_MEMORY)  
// ... 

函数"KS_sendSocket"通过 TCP 套接字发送数据。作为参数,套接字句柄、缓冲区、缓冲区的大小(以字节为单位)、发送的实际大小(以字节为单位)以及传递标志。此函数用于通过面向连接的套接字 hSocket 发送数据。在 pBuffer 中,必须提供指向数据缓冲区的指针,在 length 中,必须提供该缓冲区的长度(以字节为单位)。通过可选地址 pLength,可以回写发送数据的实际长度。

执行套接字命令

函数 KS_execSocketCommand 在套接字上执行特定命令。作为参数,套接字句柄、命令、可选参数和标志被传递。

具体命令的说明可以在 KS_execSocketCommand 的 API 文档中找到。有关如何设置可选参数 pParam 或标志的信息也可以在此处找到。

例如,如果需要设置最大传输单位,则可以使用命令"KS_SOCKET_SET_MTU"。可选参数 pParam 设置为 32 位整数。

安装套接字处理器

要安装套接字处理程序,可以使用函数 KS_installSocketHandler。作为参数,套接字句柄、事件代码、回调句柄和标志被传递。使用事件代码时,将指定处理程序的类型。

事件代码描述
‘KS_SOCKET_RECV’已收到数据。
‘KS_SOCKET_CONNECTED’客户端已连接(仅限 TCP)。
‘KS_SOCKET_DISCONNECTED’客户端已断开连接(仅限 TCP)。
‘KS_SOCKET_CLEAR_TO_SEND’套接字已准备好进行发送操作(仅限 TCP)。

注意:事件代码"KS_SOCKET_CONNECTED"、"KS_SOCKET_DISCONNECTED"和"KS_SOCKET_CLEAR_TO_SEND"仅适用于 TCP。

调用处理程序时应执行的代码作为回调句柄传递(参见 创建回调)。对于不同的事件代码,特殊的上下文结构在 context 参数中传递给回调函数。可以在函数 KS_installSocketHandler 的 API 文档中找到列表。

对于"KS_SOCKET_RECV"事件代码,对应的上下文结构为 SocketUserContext。

如果输入 null/NULL/NIL 作为回调句柄,则再次卸载处理程序。

‘KS_SOCKET_RECV’:此事件允许使用所有协议,并在数据可用时立即使用"KS_recvFromSocket"/"KS_recvSocket"发出信号。

‘KS_SOCKET_CONNECTED’:这些事件仅适用于 TCP 套接字。一旦客户端尝试注册,它将在服务器套接字上发出信号;在客户端套接字上(如果已建立连接)。

‘KS_SOCKET_DISCONNECTED’:这些事件仅适用于 TCP 套接字。一旦另一端关闭连接,它将在服务器或客户端套接字上发出信号。

‘KS_SOCKET_CLEAR_TO_SEND’:此事件仅适用于 TCP 套接字。当必须发送的数据量减少到缓冲区大小的一半以下时,将发出此事件信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值