程序员社区

CAPL学习之路-TCP/IP接口函数

TCP/IP API提供访问TCP/IP网络功能的接口函数。它是在Windows操作系统的本机Winsock 2 API之上实现的。API分为以下几类:

IP API

IP API包括用于网络信息检索的通用功能,例如查询已安装的网络接口卡(NIC)、IP地址、地址转换功能、错误处理等。此外,IP API还具有一些用于套接字操作的特殊功能,例如设置套接字选项或绑定

IpAddAdapterAddress

将地址添加到具有给定索引的网络接口

传入的网络接口卡索引参数以1为开始,不是0

capl中调用函数添加或删除IP地址,并不会保留在最终的TCP/IP协议栈中,但是效果是一样的

IpBind

将地址和端口与指定的套接字关联

在使用TcpOpen(0, 0)生成未绑定的套接字后,该函数将地址和端口与指定的套接字相关联

使用TcpConnect或TcpListen时不要使用IpBind,因为这两个命令隐式地绑定了套接字

IpGetAdapter

获取指定通道的网卡接口索引

该函数返回指定以太网通道配置的适配器的索引。对于VLAN适配器,必须传入通道和vlanId参数

IpGetAdapterAddress

检索指定网络接口关联的地址

传入的网络接口卡索引参数以1为开始,不是0

IpGetAdapterAddressAsString

检索与指定网络接口关联的第一个地址的字符串表示形式

传入的网络接口卡索引参数以1为开始,不是0

IpGetAdapterChannel

获取指定适配器的通道号

该函数返回带有指定索引的网络适配器所连接的以太网通道的编号(1表示Eth 1)

IpGetAdapterAddressCount

获取分配给适配器的地址数量

IpGetAdapterCount

返回本地计算机的网络接口数

不包括回环接口

IpGetAdapterDescription

检索指定网络接口的描述

IpGetAdapterGateway

检索与指定网络接口关联的默认网关地址

IpGetAdapterGatewayAsString

检索与指定网络接口关联的默认网关地址的字符串形式

IpGetAdapterMacId

获取接口的MAC地址

IpGetAdapterMask

检索与指定网络接口关联的地址掩码

IpGetAdapterMaskAsString

检索与指定网络接口关联的第一个地址掩码的字符串形式

IpGetAdapterVlanDefaultPriority

获取指定适配器的VLAN优先级

IpGetAdapterVlanId

获取指定适配器的VLAN id

IpGetAddressAsArray

将冒号表示的地址字符串转换为16字节数组,地址字节按网络顺序排列

该函数是将IPv6地址的字符串形式转换成byte数组形式

传入的第一个参数应该是IPv6地址字符串形式

IpGetAddressAsNumber

将点表示法的地址字符串转换为其数值

该函数是将IPv4地址的字符串形式转换成数字形式

IpGetAddressAsString

将数字地址转换为点表示的字符串地址

这个函数可以把IPv4地址或IPv6地址转换成字符串形式

如果是IPv4,传入的参数是IPv4的数字形式,转换成点表示的字符串形式

如果是IPv6,传入的参数是IPv6的byte数组形式,转换成冒号表示的字符串形式

IpGetHostByName

获取指定主机名的地址

这里的主机名是ECU名称,通常指的是Simulation Setup中的网络节点

IpGetLastError

返回上次失败操作的Winsock 2错误代码

比如说调用TcpOpen()函数,如果失败了,可以通过调用这个函数获取error code,进而知道哪里出错

on start
{
  // produces an error 10049...
  TcpOpen(0xffffffff, 1);
  writeLineEx(1, 3, "IpGetLastError: %d", IpGetLastError());
}

IpGetLastSocketError

返回在指定套接字上失败的最后一个操作的Winsock 2错误代码

IpGetLastSocketErrorAsString

检索在指定套接字上失败的最后一个操作的错误消息

这个函数更直接,直接返回套接字操作失败的原因,字符串形式

IpGetSocketAddressFamily

获取套接字的地址族

这个地址族指的是套接字是绑定在IPv4上还是IPv6

IpGetSocketName

获取套接字的本地地址和端口

该函数返回套接字的本地绑定地址和端口

IpGetSocketOption

读取指定套接字选项的值

套接字选项有哪些,可以参考之前的文章《Socket》

IpGetStackParameter

获取TCP/IP协议栈的指定参数的值

可以读取的参数

IpJoinMulticastGroup

加入指定套接字上的多播组

IpLeaveMulticastGroup

离开先前加入的多播组

IpRemoveAdapterAddress

从指定的网络接口中删除地址

IPRouteAddGateway

将网关路由添加到TCP/IP协议栈

使用此功能,可以将静态网关路由添加到tcp/ip协议栈中的路由表。根据给定的掩码(IPv4)或前缀(IPv6),添加到单个主机或网络的路由

当安装了这样的路由时,tcp/ip协议栈将通过给定的网关发送发往该目标地址或网络的数据包

IPRouteAddHost

将主机路由添加到TCP/IP协议栈

使用此功能,可以将静态主机路由添加到tcp/ip协议栈中接口的路由表。当安装了这样的路由时,tcp/ip协议栈将在向该目的地发送消息时不再执行ARP请求或邻居请求

接口或网络路由必须已经存在。因此可以找到该路由的专用接口。当没有找到接口路由时,可以使用函数IPRouteAddInterface添加一个

IPRouteAddInterface

将接口路由添加到TCP/IP协议栈

就是可以路由到目的地址的路由接口

IPRouteDeleteGateway

从TCP/IP协议栈中删除网关路由

IPRouteDeleteHost

从TCP/IP协议栈中删除主机路由

IPRouteDeleteInterface

从TCP/IP协议栈中删除接口路由

IpSetAdapterGateway

设置默认网关地址

IPSetAdapterStatus

激活或停用TCP/IP协议栈的指定适配器

使用此功能可以激活或停用TCP/IP协议栈的网络适配器

当适配器关闭时,该适配器的所有IP地址将被删除,并且该适配器上的发送或接收数据包将停止

如果在此适配器上配置的网络中配置了默认网关,则它也将被删除

重新设置适配器时,将重新配置TCP/IP协议栈对话框中配置的地址,并重新设置默认网关

CAPL学习之路-TCP/IP接口函数插图2

IpSetMulticastInterface

设置传出组播消息的接口

IpSetSocketOption

修改套接字选项

IpSetStackParameter

设置TCP/IP协议栈的指定参数的值

IP接口支持的回调函数

OnIpAddressAdded

当地址被添加到网络接口时调用

注意这个回调函数里的参数,是一些形参,能把添加的网络接口相关信息取出来

OnIpAddressRemoved

当地址从网络接口中删除时调用

OnIpGetHostByName

当阻塞的IpGetHostByName函数完成时调用它

OnIpReceivePrepare

它在接收到的数据包被分派到TCP/IP协议栈之前被分派

如果CAPL程序实现了这个回调,它会在接收到的数据包被分派到 TCP/IP协议栈之前被调用

可以操纵数据包的内容或阻止从总线接收数据包

也就是说,capl里的程序,比如说socket还没拿到数据包,就可以提前在这里拿到数据包

OnIpSendPrepare

在TCP/IP协议栈发送数据包之前调用它

UDP API

UDP API用于UDP通信。它为实现无连接的、面向数据报的通信提供了一个高级接口

UdpClose

关闭UDP套接字

成功完成后,该套接字不再有效

UdpConnect

将UDP套接字连接到指定的远程地址

该函数将此套接字连接到指定的远程端点。套接字连接后,需要使用UdpSend而不是UdpSendTo来传输数据

在服务器端,第一次在套接字上接收数据时,可以连接到远程端点。之后,可以创建一个新的未连接的Socket以等待下一个传入的udp连接

UdpOpen

创建用于无连接、面向数据报的通信的UDP套接字

UdpReceiveFrom

将数据接收到指定的缓冲区

该函数将数据接收到指定的缓冲区中。如果接收操作没有立即完成,则异步执行操作,函数将返回SOCKET_ERROR(-1)。使用IpGetLastSocketError获取更具体的错误代码。如果特定的错误代码是WSA_IO_PENDING(997),则回调函数OnUdpReceiveFrom将在完成时被调用(成功与否),前提是它在同一个CAPL程序中实现

UdpSend

在连接的UDP套接字上发送数据

该函数在连接的UDP套接字上发送数据。在调用这个函数之前,需要用UdpConnect连接套接字

UdpSendTo

将数据发送到指定位置

这个函数和UdpSend的区别就是,不需要先调用UdpConnect连接套接字

UDP接口支持的回调函数

OnUdpReceiveFrom

当UDP套接字上的异步接收操作完成时调用它

如果CAPL程序实现了此回调,则在UDP套接字上的异步接收操作完成时调用它

堆栈包含一个数据队列,一旦数据位于该队列,UdpReceiveFrom就会被调用以减少该队列数据

为了在将来为套接字接收来自数据队列的多余数据,必须在回调中再次调用UdpReceiveFrom,以实现循环接收数据

OnUdpSendTo

当UDP套接字上的异步发送操作完成时调用它

TCP API

TcpAccept

在指定的套接字上接受传入的连接请求,从而产生一个新的套接字

该函数在指定的套接字(被动套接字,TcpListen返回的套接字)上接受传入的连接请求,从而产生一个新的套接字。如果操作失败,该函数将返回INVALID_SOCKET (~0)。

当客户端使用TcpConnect建立连接时,使用TcpListen创建的侦听套接字会使用回调函数OnTcpListen进行响应

必须始终使用TcpAccept接受传入连接。这通常在回调函数OnTcpListen中执行

只要连接不被接受,监听套接字上就不能接受其他客户端。然后所有其他传入客户端在回调OnTcpConnect中传递错误10061(连接被拒绝),并且随后也不能再被接受

在不接受连接的情况下,系统会进入没有其他任何事情发生的状态,因为无法发送数据并且其他客户端在侦听套接字上被拒绝

堆栈中的传入连接有一个队列大小。这在CANoe中永久设置为 1,因此只有一个客户端可以在队列中,直到它被接受

一旦连接被接受,客户端就会有一个新的套接字,可以使用TcpReceive等待传入的数据,并且可以使用TcpSend将数据发送到客户端

TcpClose

关闭TCP套接字

成功完成后,被关闭的套接字不再有效,无效套接字值是~0

TcpConnect

与服务器套接字建立连接

TCPGetRemoteAddress

检索指定套接字的远程地址

就是获取和此套接字建立连接的对端主机的IP地址

TCPGetRemoteAddressAsString

以Internet标准点分十进制格式检索指定套接字的远程地址

其实就是获取对端主机IP地址的字符串形式

TcpGetRemoteEndpoint

检索指定连接套接字的远程端口

端口不是指的端口号,而是IP和Port的组合,(ip, port)

TcpListen

使套接字侦听传入的连接请求

这个函数把主动的套接字转成被动套接字,监听连接请求

TcpOpen

创建用于基于连接的、面向消息的通信的TCP套接字

根据地址类型,该函数创建IPv4或IPv6 TCP套接字,用于基于连接的、面向消息的通信。所有参数可能为零。如果端口参数不为零,则套接字隐式绑定到给定端口。否则,套接字可以稍后使用IpBind绑定,或者它将自动绑定到使用TcpConnect的空闲端口

TcpReceive

将数据接收到指定的缓冲区

TcpSend

在指定的套接字上发送数据

TcpShutdown

禁用指定套接字上的发送操作

使用此函数时,套接字(与TcpClose不同)仅针对发送方向关闭。仍然可以接收数据

TCP接口支持的回调函数

OnTcpClose

当TCP套接字收到关闭通知时调用它

当对端主机使用TcpClose或TcpShutdown终止连接时,会发送断开连接请求给此主机,此主机接收到断开连接请求时,会自动调用这个回调函数

要释放套接字的资源,必须在这个回调函数内调用TcpClose关闭自己的套接字

// ---------------------------------------------------
// TCP socket receives a close notification
// ( remote disconnected )
// ---------------------------------------------------

void OnTcpClose( dword socket, long result)
{
  writeLineEx(1, 1, " [ OnTcpClose called. (socket: %d, result: %d) ]", socket, result);
  TcpClose(socket);
}

OnTcpConnect

它在异步连接操作完成时调用

也就是说调用TcpConnect函数时发起连接,连接操作完成后,会调用这个回调函数,连接的结果也在这个回调函数里获取

OnTcpListen

当接收到指定套接字的连接请求时调用它

如果CAPL程序实现了此回调,则在调用TcpListen并接收到指定套接字的连接请求时调用它

必须使用TcpAccept接受连接,否则监听套接字对于其他客户端保持阻塞,也就是说前面的连接请求如果没有被TcpAccept接受的话,后面的连接请求会一直阻塞在那

OnTcpReceive

当TCP套接字上的异步接收操作完成时调用它

如果CAPL程序实现了此回调,则在TCP套接字上的接收操作完成时调用它

堆栈包含一个数据队列,一旦数据位于该队列,该队列就会被TcpReceive调用取走而减少

为了循环接收队列中的数据,必须在这个回调函数中再次调用TcpReceive

OnTcpSend

当TCP套接字上的异步发送操作完成时调用它

如果CAPL程序实现了此回调,则在堆栈中的数据已处理但尚未放在总线上时调用它。信息在物理发送后首先显示在CANoe Trace窗口中


点赞过20,后续会讨论如何用capl编写tcp socket实现客户端与服务器的tcp连接、传输数据与断开连接

赞(5) 打赏
未经允许不得转载:IDEA激活码 » CAPL学习之路-TCP/IP接口函数

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区