直接跳到内容

网络通讯

Socket

  • 位置

sys_socket.aclib

  • 功能说明

创建一个新的socket,并返回socket句柄。

  • 参数说明
输入参数数据类型描述掉电保持常量
address_familyDINT地址族××
socket_typeDINT数据传输方式/套接字类型××
protocolDINT传输协议××
输出参数数据类型描述掉电保持常量
SocketDINT失败返回-1,其余表示新创建的socket句柄。××

address_family项的值如下:

名称含义
SOCKET_AF_UNSPEC0unspecified
SOCKET_AF_LOCAL1local to host(pipes, portals)
SOCKET_AF_UNIX1backward compatibility
SOCKET_AF_INET2internetwork: TCP, UDP, etc.
SOCKET_AF_IMPLINK3arpanet imp addresses
SOCKET_AF_PUP4pup protocols: e.g. BSP
SOCKET_AF_CHAOS5mit CHAOS protocols
SOCKET_AF_NS6XEROX NS protocols
SOCKET_AF_ISO7ISO protocols
SOCKET_AF_OSI7OSI protocols
SOCKET_AF_ECMA8european computer manufacturers
SOCKET_AF_DATAKIT9datakit protocols
SOCKET_AF_CCITT10CCITT protocols, X.25 etc
SOCKET_AF_SNA11IBM SNA
SOCKET_AF_DECnet12DECnet
SOCKET_AF_DLI13DEC Direct data link interface
SOCKET_AF_LAT14LAT
SOCKET_AF_HYLINK15NSC Hyperchannel
SOCKET_AF_APPLETALK16Apple Talk
SOCKET_AF_ROUTE17Internal Routing Protocol
SOCKET_AF_LINK18Link layer interface
SOCKET_pseudo_AF_XTP19eXpress Transfer Protocol (no AF)
SOCKET_AF_COIP20connection-oriented IP, aka ST II
SOCKET_AF_CNT21Computer Network Technology
SOCKET_pseudo_AF_RTIP22Help Identify RTIP packets
SOCKET_AF_IPX23Novell Internet Protocol
SOCKET_AF_SIP24Simple Internet Protocol
SOCKET_pseudo_AF_PIP25Help Identify PIP packets
SOCKET_AF_MAX26Max definition
SOCKET_AF_INET_BSD100BSD-specific INET af
SOCKET_AF_INET_STREAMS101STREAMS-specific INET af

socket_type项的值如下:

名称含义
SOCKET_STREAM1stream socket
SOCKET_DGRAM2datagram socket
SOCKET_RAW3raw-protocol interface
SOCKET_RDM4reliably-delivered message
SOCKET_SEQPACKET5sequenced packet stream

protocol项的值如下:

名称含义
SOCKET_IPPROTO_IP0dummy for IP
SOCKET_IPPROTO_ICMP1control message protocol
SOCKET_IPPROTO_IGMP2group management protocol
SOCKET_IPPROTO_GGP3gateway^2 (deprecated)
SOCKET_IPPROTO_TCP6tcp
SOCKET_IPPROTO_PUP12pup
SOCKET_IPPROTO_UDP17user datagram protocol
SOCKET_IPPROTO_IDP22xns idp
SOCKET_IPPROTO_ND77UNOFFICIAL net disk proto
SOCKET_IPPROTO_TLS254UNOFFICIAL TCP/TLS protocol
SOCKET_IPPROTO_RAW255raw IP packet
SOCKET_IPPROTO_MAX256Max definition
  • 示例

    • 示例功能说明 创建一个UDP类型的socket。

    • 变量定义

      变量名数据类型初值注释
      hSocketDINT套接字句柄
      socket_familyDINTSOCKET_AF_INET
      socket_typeDINTSOCKET_DGRAM
      socket_protocolDINTSOCKET_IPPROTO_UDP
    • CFC示例 img

    • ST示例 hSocket := Socket( socket_family , socket_type , socket_protocol);

    • LD示例 img

SocketClose

  • 位置

sys_socket.aclib

  • 功能说明

关闭一个socket。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
输出参数数据类型描述掉电保持常量
SocketCloseDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 关闭一个socket。

    • 变量定义

      变量名数据类型初值注释
      hSocketDINT套接字句柄
      retCloseDINT
    • CFC示例 img

    • ST示例 retClose := SocketClose( hSocket );

    • LD示例 img

SocketBind

  • 位置

sys_socket.aclib

  • 功能说明

socket绑定。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
addressPOINTER TO sockaddrsocket地址指针××
address_lenDINTsocket地址结构长度××
输出参数数据类型描述掉电保持常量
SocketBindDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP服务器”中关于 SocketBind 的使用。

SocketListen

  • 位置

sys_socket.aclib

  • 功能说明

socket监听。

  • 参数说明
输入参数数据类型描述保持常量
sockfdDINTsocket句柄××
max_connectionsDINT允许连接的客户端最大个数××
输出参数数据类型描述保持常量
SocketListenDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP服务器”中关于 SocketListen 的使用。

SocketAccept

  • 位置

sys_socket.aclib

  • 功能说明

接受一个socket连接。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
client_addressPOINTER TO sockaddr返回已连接的客户端的socket地址××
address_lenPOINTER TO DINT返回的socket地址结构长度××
输出参数数据类型描述掉电保持常量
SocketAcceptDINT失败返回-1,其余表示新连接的socket句柄××
  • 示例

请参考“Socket综合示例-TCP服务器”中关于 SocketAccept 的使用。

SocketConnect

  • 位置

sys_socket.aclib

  • 功能说明

连接一个客户端。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
server_addressPOINTER TO sockaddrsocket地址指针××
address_lenDINTsocket地址结构长度××
输出参数数据类型描述掉电保持常量
SocketConnectDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP客户端”中关于 SocketConnect 的使用。

SocketSetOption

  • 位置

sys_socket.aclib

  • 功能说明

设置socket选项。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
levelDINTsocket级别××
option_nameDINT选项命令字××
option_valuePOINTER TO DINT指向选项值的指针××
option_lenDINT选项值的长度××
输出参数数据类型描述掉电保持常量
SocketSetOptionDINT成功返回0,失败返回-1××

level和option_name详见sys_socket.aclib中socket_const下的相关字段。

支持的level项有:

名称含义
SOCKET_SOL16#FFFF基本socket
SOCKET_IPPROTO_IP0IPv4 socket
SOCKET_IPPROTO_TCP6TCP socket

其中,level项为SOCKET_SOL时支持的option_name(即选项命令字)有:

名称含义
SOCKET_SO_DEBUG16#0001turn on debugging info recording
SOCKET_SO_ACCEPTCONN16#0002socket has had listen()
SOCKET_SO_REUSEADDR16#0004allow local address reuse
SOCKET_SO_KEEPALIVE16#0008keep connections alive
SOCKET_SO_DONTROUT16#0010just use interface addresses
SOCKET_SO_BROADCAST16#0020permit sending of broadcast msgs
SOCKET_SO_USELOOPBACK16#0040bypass hardware when possible
SOCKET_SO_LINGER16#0080linger on close if data present
SOCKET_SO_OOBINLINE16#0100leave received OOB data in line
SOCKET_SO_REUSEPORT16#0200allow local address & port reuse
SOCKET_SO_SNDBUF16#1001send buffer size
SOCKET_SO_RCVBUF16#1002receive buffer size
SOCKET_SO_SNDLOWAT16#1003send low-water mark
SOCKET_SO_RCVLOWAT16#1004receive low-water mark
SOCKET_SO_SNDTIMEO16#1005send timeout
SOCKET_SO_RCVTIMEO16#1006receive timeout
SOCKET_SO_ERROR16#1007get error status and clear
SOCKET_SO_TYPE16#1008get socket type
SOCKET_SO_PROTOTYPE16#1009get/set protocol type
SOCKET_SO_HOSTNAME16#2001get/set host name for tls connections. Needed for SNI(Server Name Indication)
SOCKET_SO_STARTTLS16#3001upgrade standard socket to TLS. Works only on sockets with socket type SYSSOCK_TYPE_STARTTLS!
SOCKET_SO_MULTICAST_IFIP multicast interface - obsolete only for backward compatibility.

其中,level项为SOCKET_IPPROTO_IP时支持的option_name(即选项命令字)有:

名称含义
SOCKET_IP_MULTICAST_IF16#9IP multicast interface
SOCKET_IP_MULTICAST_TTL16#AIP multicast TTL (hop limit)
SOCKET_IP_MULTICAST_LOOP16#BIP multicast loopback
SOCKET_IP_ADD_MEMBERSHIP16#CAdd an IP group membership.
SOCKET_IP_DROP_MEMBERSHIP16#DDrop an IP group membership.
SOCKET_IP_DONTFRAGMENT16#EIndicates that data should not be fragmented regardless of the local MTU. Valid only for message oriented protocols (UDP etc).

其中,level项为SOCKET_IPPROTO_TCP时支持的option_name(即选项命令字)有:

名称含义
SOCKET_TCP_NODELAY16#01don't delay send to coalesce packets
SOCKET_TCP_MAXSEG16#02set maximum segment size
  • 示例

请参考“Socket综合示例-TCP服务器”中关于 SocketSetOption 的使用。

SocketGetOption

  • 位置

sys_socket.aclib

  • 功能说明

获取socket选项。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
levelDINTsocket级别××
option_nameDINT选项命令字××
option_valuePOINTER TO DINT指向选项值的指针××
option_lenPOINTER TO DINT通过指针返回选项值的长度××
输出参数数据类型描述掉电保持常量
SocketGetOptionDINT成功返回0,失败返回-1××

level和option_name与SocketSetOption中的一致。

  • 示例

    • 示例功能说明 获取SOCKET_SO_REUSEADDR选项的值。

    • 变量定义

      变量名数据类型初值注释
      hSocketDINT
      iOptValueDINT选项值
      iOptValueLenDINT
      iOprRetDINT
    • CFC示例 img

    • ST示例 iOprRet := SocketGetOption( hSocket , SOCKET_SOL , SOCKET_SO_REUSEADDR , ADR(iOptValue) , ADR(iOptValueLen) );

    • LD示例 img

    SocketIoctl

  • 位置

sys_socket.aclib

  • 功能说明

ioctl设置。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
requestDINT命令字××
parameterPOINTER TO DINT命令字参数××
输出参数数据类型描述掉电保持常量
SocketIoctlDINT成功返回0,失败返回-1××

request项的值详见sys_socket.aclib中socket_const下的相关字段,如下:

名称含义
SOCKET_FIONREAD1get num chars available to read
SOCKET_FIONBIO2set to non-blocking
  • 示例

请参考“Socket综合示例-TCP服务器”中关于 SocketIoctl 的使用。

SocketRecv

  • 位置

sys_socket.aclib

  • 功能说明

socket接收数据。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
bufferPOINTER TO BYTE接收到的数据的存放地址××
buffer_lenDINT待接收的数据长度××
flagsDINT相关标识,无可填0××
输出参数数据类型描述掉电保持常量
SocketRecvDINT成功返回接收到的字符数,失败返回-1××

flags项的值详见sys_socket.aclib中socket_const下的相关字段,如下:

名称含义
SOCKET_MSG_NONE16#0no flag
SOCKET_MSG_OOB16#1process out-of-band data
SOCKET_MSG_PEEK16#2peek at incoming message
SOCKET_MSG_DONTROUTE16#4send without using routing tables
SOCKET_MSG_NONTWAIT16#8send TCP frame directly without blocking
  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketRecv 的使用。

SocketRecvfrom

  • 位置

sys_socket.aclib

  • 功能说明

socket接收数据。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
bufferPOINTER TO BYTE接收到的数据的存放地址××
buffer_lenDINT待接收的数据长度××
flagsDINT相关标识,无可填0××
from_addressPOINTER TO sockaddrsocket地址××
from_address_lenPOINTER TO DINTsocket地址结构长度××
输出参数数据类型描述掉电保持常量
SocketRecvfromDINT成功返回接收到的字符数,失败返回-1××

flags项与SocketRecv中的flags项相同。

  • 示例

请参考“Socket综合示例-UDP服务器”中关于 SocketRecvfrom 的使用。

SocketSend

  • 位置

sys_socket.aclib

  • 功能说明

socket发送数据。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
bufferPOINTER TO BYTE待发送数据缓存××
buffer_lenDINT待发送数据长度,单位Byte××
flagsDINT相关标识,无可填0××
输出参数数据类型描述掉电保持常量
SocketSendDINT成功返回已发送的字符数,失败返回-1××

flags项与SocketRecv中的flags项相同。

  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketSend 的使用。

SocketSendto

  • 位置

sys_socket.aclib

  • 功能说明

socket发送数据。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
bufferPOINTER TO BYTE待发送数据缓存××
buffer_lenDINT待发送数据长度,单位Byte××
flagsDINT相关标识,无可填0××
from_addressPOINTER TO sockaddrsocket地址××
from_address_lenPOINTER TO DINTsocket地址结构长度××
输出参数数据类型描述掉电保持常量
SocketSendtoDINT成功返回已发送的字符数,失败返回-1××

flags项与SocketRecv中的flags项相同。

  • 示例

请参考“Socket综合示例-UDP服务器”中关于 SocketSendto 的使用。

SocketShutdown

  • 位置

sys_socket.aclib

  • 功能说明

socket关闭。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
howtoDINT关闭方式××
输出参数数据类型描述掉电保持常量
SocketShutdownDINT成功返回0,失败返回-1××

关闭方式详见sys_socket.aclib中socket_const下的相关字段:

名称含义
SOCKET_SD_RECEIVE16#0Receive is no longer allowed
SOCKET_SD_SEND16#1Send is no longer allowed
SOCKET_SD_BOTH16#2Send and receive is no longer allowed
  • 示例

    • 示例功能说明 以SOCKET_SD_BOTH的方式关闭一个套接字。

    • 变量定义

      变量名数据类型初值注释
      hSocketDINT套接字句柄
      retCloseDINT
    • CFC示例 img

    • ST示例 retClose := SocketShutdown( hSocket , SOCKET_SD_BOTH );

    • LD示例 img

SocketGetHostByName

  • 位置

sys_socket.aclib

  • 功能说明

根据名称获取主机信息。

  • 参数说明
输入参数数据类型描述掉电保持常量
host_namePOINTER TO BYTE主机名字符串首地址××
hostPOINTER TO hostent返回的主机描述信息××
输出参数数据类型描述掉电保持常量
SocketGetHostByNameDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 先通过SocketGetHostName得到主机名字符串信息,然后再通过SocketGetHostByName获取主机信息。

    • 变量定义

      变量名数据类型初值注释
      strHostNameSTRING(80)主机名
      host_infohostent主机信息
      iOprRetDINT
    • CFC示例 img

    • ST示例 iOprRet := SocketGetHostName( ADR(strHostName) , SIZEOF(strHostName) ); iOprRet := SocketGetHostByName( ADR(strHostName) , ADR(host_info) );

    • LD示例 img

SocketGetHostName

  • 位置

sys_socket.aclib

  • 功能说明

获取主机名称。

  • 参数说明
输入参数数据类型描述掉电保持常量
host_namePOINTER TO BYTE存放主机名字符串的首地址××
name_lenDINT存放字符串的内存空间大小××
输出参数数据类型描述掉电保持常量
SocketGetHostNameDINT成功返回0,失败返回-1××
  • 示例

请参考“SocketGetHostByName”示例中关于 SocketGetHostName的使用。

SocketHtonl

  • 位置

sys_socket.aclib

  • 功能说明

主机字节序转换为网络字节序(四字节)。

  • 参数说明
输入参数数据类型描述掉电保持常量
host_longDWORD待转换的值××
输出参数数据类型描述掉电保持常量
SocketHtonlDWORD转换后的值××
  • 示例

    • 示例功能说明 将初值为16#12345678的变量进行主机到网络字节序转换,转换结果为16#78563412。

    • 变量定义

      变量名数据类型初值注释
      host_longDWORD16#12345678待转换的值
      dwRetDWORD转换结果为16#78563412
    • CFC示例 img

    • ST示例 dwRet := SocketHtonl( host_long );

    • LD示例 img

SocketHtons

  • 位置

sys_socket.aclib

  • 功能说明

主机字节序转换为网络字节序(二字节)。

  • 参数说明
输入参数数据类型描述掉电保持常量
host_shortWORD待转换的值××
输出参数数据类型描述掉电保持常量
SocketHtonsWORD转换后的值××
  • 示例

    • 示例功能说明 将初值为16#1234的变量进行主机到网络字节序转换,转换结果为16#3412。

    • 变量定义

      变量名数据类型初值注释
      host_shortWORD16#1234待转换的值
      wRetWORD转换结果为16#3412
    • CFC示例 img

    • ST示例 wRet := SocketHtons( host_short );

    • LD示例 img

SocketNtohl

  • 位置

sys_socket.aclib

  • 功能说明

网络字节序转换为主机字节序(四字节)。

  • 参数说明
输入参数数据类型描述掉电保持常量
net_longDWORD待转换的值××
输出参数数据类型描述掉电保持常量
SocketNtohlDWORD转换后的值××
  • 示例

    • 示例功能说明 将初值为16#12345678的变量进行网络到主机字节序转换,转换结果为16#78563412。

    • 变量定义

      变量名数据类型初值注释
      net_longDWORD16#12345678待转换的值
      dwRetDWORD转换结果为16#78563412
    • CFC示例 img

    • ST示例 dwRet := SocketNtohl( net_long );

    • LD示例 img

SocketNtohs

  • 位置

sys_socket.aclib

  • 功能说明

网络字节序转换为主机字节序(二字节)。

  • 参数说明
输入参数数据类型描述掉电保持常量
net_shortWORD待转换的值××
输出参数数据类型描述掉电保持常量
SocketNtohsWORD转换后的值××
  • 示例

    • 示例功能说明 将初值为16#1234的变量进行网络到主机字节序转换,转换结果为16#3412。

    • 变量定义

      变量名数据类型初值注释
      net_shortWORD16#1234待转换的值
      wRetWORD转换结果为16#3412
    • CFC示例 img

    • ST示例 wRet := SocketNtohs( net_short );

    • LD示例 img

SocketInetAddr

  • 位置

sys_socket.aclib

  • 功能说明

将字符串类型的IP地址转换为四字节的IP地址。

  • 参数说明
输入参数数据类型描述掉电保持常量
ip_address_stringPOINTER TO BYTE待转换的IP地址字符串××
ip_address_in_addrPOINTER TO in_addr转换后的四字节IP地址××
输出参数数据类型描述掉电保持常量
SocketInetAddrDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 将字符串类型的IP地址'192.168.0.100' 转换为 整形值16#6400A8C0。

    • 变量定义

      变量名数据类型初值注释
      strIPSTRING(15)'192.168.0.100'待转换的值
      in_addrin_addr转换后的值,in_addr结构中的addr值为16#6400A8C0
      iOprRet是否转换成功
    • CFC示例 img

    • ST示例 iOprRet := SocketInetAddr( ADR(strIP) , ADR(in_addr) );

    • LD示例 img

SocketInetNtoa

  • 位置

sys_socket.aclib

  • 功能说明

将IP地址数据结构转换为字符串类型的IP地址。

  • 参数说明
输入参数数据类型描述掉电保持常量
ip_address_in_addrPOINTER TO in_addr待转换的IP地址描述信息××
ip_address_stringPOINTER TO BYTE转换后的IP地址字符串××
ip_address_string_sizeDINT存放IP地址字符串的内存空间大小(至少16字节)××
输出参数数据类型描述掉电保持常量
SocketInetNtoaDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 将整形IP地址值16#6400A8C0转换为字符串类型的IP地址'192.168.0.100'。

    • 变量定义

      变量名数据类型初值注释
      in_addr_inputin_addr(addr := 16#6400A8C0)待转换的值
      strIPSTRING(15)转换后的值,结果为'192.168.0.100'
      iOprRet是否转换成功
    • CFC示例 img

    • ST示例 iOprRet := SocketInetNtoa( ADR(in_addr_input) , ADR(strIP) , SIZEOF(strIP) );

    • LD示例 img

SocketGetAddrInfo

  • 位置

sys_socket.aclib

  • 功能说明

处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。

  • 参数说明
输入参数数据类型描述掉电保持常量
hostnamePOINTER TO BYTE一个主机名或者地址字符串(IPv4的点分十进制串或者IPv6的十六进制字符串)××
servicePOINTER TO BYTE一个服务名或者十进制端口号数字符串××
hintsPOINTER TO addrinfo可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示××
resultPOINTER TO addrinfo返回的地址信息××
输出参数数据类型描述掉电保持常量
SocketGetAddrInfoDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 先通过SocketGetHostName得到主机名,然后再调用SocketGetAddrInfo获取UDP类型的socket地址信息。

    • 变量定义

      变量名数据类型初值注释
      strHostNameSTRING(80)主机名
      strServiceSTRING(80)服务名
      hints_inputaddrinfo(ai_family := 2,ai_socktype := 2,ai_protocol := 17)关注的地址信息
      hints_resultaddrinfo获取到的地址信息
      iOprRetDINT是否转换成功
    • CFC示例 img

    • ST示例 iOprRet := SocketGetHostName( ADR(strHostName) , SIZEOF(strHostName) ); iOprRet := SocketGetAddrInfo( ADR(strHostName) , ADR(strService) , ADR(hints_input) , ADR(hints_result) );

    • LD示例 img

SocketGetNameInfo

  • 位置

sys_socket.aclib

  • 功能说明

以一个套接字地址为参数,返回描述其中的主机的一个字符串和描述其中的服务的另一个字符串。

  • 参数说明
输入参数数据类型描述电掉保持常量
addressPOINTER TO sockaddrsocket地址指针××
address_lenDINTsocket地址结构长度××
hostPOINTER TO BYTE主机字符串××
host_lenDINT主机字符串长度,如果为0表示不想返回主机字符串××
servicePOINTER TO BYTE服务字符串××
service_lenDINT服务字符串长度,如果为0表示不想返回服务字符串××
flagsDINT相关标识,无可填0××
输出参数数据类型描述掉电保持常量
SocketGetNameInfoDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 获取一个已打开的socket句柄对应的主机名字符串及服务名字符串。

    • 变量定义

      变量名数据类型初值注释
      socket_addrsockaddr已打开的socket地址信息
      strHostNameSTRING(80)主机名
      strServiceSTRING(80)服务名
      iFlagsDINT
      iOprRet
    • CFC示例 img

    • ST示例 iOprRet := SocketGetNameInfo( ADR(socket_addr) , SIZEOF(socket_addr) , ADR(strHostName) , SIZEOF(strHostName) , ADR(strService) , SIZEOF(strService) , iFlags );

    • LD示例 img

GetSocketName

  • 位置

sys_socket.aclib

  • 功能说明

获取socket句柄对应的socket地址信息。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
addressPOINTER TO sockaddrsocket地址指针××
address_lenPOINTER TO DINTsocket地址结构长度××
输出参数数据类型描述掉电保持常量
GetSocketNameDINT成功返回0,失败返回-1××
  • 示例

    • 示例功能说明 获取一个socket句柄对应的socket地址信息。

    • 变量定义

      变量名数据类型初值注释
      hSocketDINTsocket句柄
      addrsockaddrsocket地址结构
      addr_lenDINTsocket地址结构长度
      iOprRetDINT
    • CFC示例 img

    • ST示例 iOprRet := GetSocketName( hSocket , ADR(addr) , ADR(addr_len) );

    • LD示例 img

SocketSelect

  • 位置

sys_socket.aclib

  • 功能说明

用来等待socket状态的改变。

  • 参数说明
输入参数数据类型描述掉电保持常量
maxfdDINTfd_set 结构中待监测的socket个数××
read_setPOINTER TO fd_set指向fd_set结构的指针,用于检测读类型的集合,如果不关心可填NULL××
write_setPOINTER TO fd_set指向fd_set结构的指针,用于检测写类型的集合,如果不关心可填NULL××
except_setPOINTER TO fd_set指向fd_set结构的指针,用于检测故障状态的集合,如果不关心可填NULL××
timeoutPOINTER TO timeval超时时间,如果为NULL 或者timeout->tv_sec=-1或者timeout->tv_usec=-1 表示一直等待,如果 timeout->tv_sec=0 或者 timeout->tv_usec=0 表示不用等待××
输出参数数据类型描述掉电保持常量
SocketSelectDINT成功返回已准备就绪的socket个数,失败返回-1××
  • 示例

    请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketSelect 的使用。

SocketFdSet

  • 位置

sys_socket.aclib

  • 功能说明

添加一个socket到集合中。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
setPOINTER TO fd_set指向socket集合的指针××
输出参数数据类型描述掉电保持常量
SocketFdSetDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketFdSet 的使用。

SocketFdClr

  • 位置

sys_socket.aclib

  • 功能说明

从集合中删除一个socket。

  • 参数说明
输入参数数据类型描述掉电保持常量
sockfdDINTsocket句柄××
setPOINTER TO fd_set指向socket集合的指针××
输出参数数据类型描述掉电保持常量
SocketFdClrDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketFdClr 的使用。

SocketFdIsSet

  • 位置

sys_socket.aclib

  • 功能说明

检测一个socket在集合中是否已激活。

  • 参数说明
输入参数数据类型描述保持常量
sockfdDINTsocket句柄××
setPOINTER TO fd_set指向socket集合的指针××
输出参数数据类型描述保持常量
SocketFdIsSetBOOL已激活返回TRUE,未激活返回FALSE××
  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketFdIsSet 的使用。

SocketFdZero

  • 位置

sys_socket.aclib

  • 功能说明

集合清零。

  • 参数说明
输入参数数据类型描述掉电保持常量
setPOINTER TO fd_set指向socket集合的指针××
输出参数数据类型描述掉电保持常量
SocketFdZeroDINT成功返回0,失败返回-1××
  • 示例

请参考“Socket综合示例-TCP服务器”和“Socket综合示例-TCP客户端”中关于 SocketFdZero 的使用。

Socket综合示例-TCP服务器

  • 示例功能说明(例程路径:安装目录\example\TCP服务器)

TCP服务器,服务器端口为2000,支持5路连接,并将接收到的数据原封不动的返回。

  • 类型定义

ServerClientInfo结构体成员如下:

名称数据类型初始值注释
hClientSocketDINT客户端连接句柄
dwRecvTimeUDINT最近一次接收到数据的时间
dwIPDWORD客户端IP地址
strIPSTRING(15)客户端IP地址
  • 变量定义
名称数据类型初始值注释
bServerSetupBOOL启动服务器
bServerCloseBOOL关闭服务器
bInitBOOLTRUE初始化服务器
hSocketListenDINT监听套接字句柄
socket_familyDINTSOCKET_AF_INET
socket_typeDINTSOCKET_STREAM
socket_protocolDINTSOCKET_IPPROTO_TCP
so_lingersocket_so_value_lingerlinger选项
iOptValueDINT选项值
dwSocketBuffSizeDWORD
SockAddrServersockaddr_in服务器地址信息
iNumMaxClientDINT5服务器最大支持的客户端连接个数
iOprRetDINT
FdSetfd_set套接字事件监测集合
FdSetRunfd_set
maxFdDINT0
diReadyDINT
tmSlecttimeval
pSetTempPOINTER TO fd_set
stClientAddresssockaddr_in客户端地址信息
diClientAddressLenDINT
hClientSocketDINT客户端socket句柄
iDINT
arrDataRecvARRAY[0..255] OF BYTE接收到的数据存放内存
diRecvLenDINT接收到的数据长度
diSendLenDINT发送的数据长度
dwRecvTotalLenDWORD累计接收到的数据长度
dwSendTotalLenDWORD累计发送的数据长度
dwTimeUDINT
dwTimeoutUDINT20000000客户端超时时间,单位us
dwServerIpAddrDWORDSOCKET_INADDR_ANY服务器IP地址
wServerPortWORD2000服务器端口号
arrClientARRAY[0..4] OF ServerClientInfo客户端信息
  • ST示例
IF bInit THEN 
   bInit := FALSE;
   
   hSocketListen := -1;

  (* 初始化客户端信息 *)
   FOR i := 0 TO iNumMaxClient BY 1 DO 
    arrClient[i].hClientSocket := -1;
    arrClient[i].dwRecvTime := 0;
    arrClient[i].dwIP := 0;
    arrClient[i].strIP := '';
  END_FOR;
   
   bServerSetup := TRUE;
END_IF;

(* 启动服务器 *)
IF bServerSetup THEN 
   bServerSetup := FALSE;

   hSocketListen := Socket( socket_family , socket_type , socket_protocol);
   IF hSocketListen >= 0 THEN 
     (* 关闭时TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态 *)
     so_linger.l_onoff := 1;
     so_linger.l_linger := 0;
     iOprRet := SocketSetOption( hSocketListen , SOCKET_SOL , SOCKET_SO_LINGER , ADR(so_linger) , SIZEOF(so_linger) );

​     iOptValue := 1;
​     (* 设置为可重复使用地址 *)
​     iOprRet := SocketSetOption( hSocketListen , SOCKET_SOL , SOCKET_SO_REUSEADDR , ADR(iOptValue) , SIZEOF(iOptValue) );
​     (* 开启Nagle算法 *)
​     iOprRet := SocketSetOption( hSocketListen , SOCKET_IPPROTO_TCP , SOCKET_TCP_NODELAY , ADR(iOptValue) , SIZEOF(iOptValue) );

​     (* 设置socket的发送、接收缓存 *)
​     dwSocketBuffSize := 32*1024;
​     iOprRet := SocketSetOption( hSocketListen , SOCKET_SOL , SOCKET_SO_SNDBUF , ADR(dwSocketBuffSize) , SIZEOF(dwSocketBuffSize) );
​     iOprRet := SocketSetOption( hSocketListen , SOCKET_SOL , SOCKET_SO_RCVBUF , ADR(dwSocketBuffSize) , SIZEOF(dwSocketBuffSize) );

​     (* 设置为非阻塞 *)
​     iOprRet := SocketIoctl( hSocketListen , SOCKET_FIONBIO , ADR(iOptValue) );

​     (* 绑定监听端口 *)
​     SockAddrServer.sin_addr.addr := SocketHtonl( dwServerIpAddr );
​     SockAddrServer.sin_family := SOCKET_AF_INET;
​     SockAddrServer.sin_port := SocketHtons( wServerPort );
​     iOprRet := SocketBind( hSocketListen , ADR(SockAddrServer) , SIZEOF(SockAddrServer) );
​     IF 0 = iOprRet THEN 
​       (* 监听 *)
​       iOprRet := SocketListen( hSocketListen , iNumMaxClient );
​       IF 0 = iOprRet THEN 
​         SocketFdZero( ADR(FdSet) );
​         SocketFdSet( hSocketListen , ADR(FdSet) );
​         IF hSocketListen > maxFd THEN 
​           maxFd := hSocketListen;
​         END_IF;
​       ELSE
​         (* 监听失败则关闭创建的socket *)
​         SocketClose( hSocketListen );
​         hSocketListen := -1;
​       END_IF;
​     ELSE
​       (* 绑定失败则关闭创建的socket *)
​       SocketClose( hSocketListen );
​       hSocketListen := -1;
​     END_IF;
   END_IF;
END_IF;

(* 数据接收处理 *)
IF hSocketListen >= 0 THEN 
   tmSlect.tv_sec := 0;
   tmSlect.tv_usec := 10000;
   FdSetRun := FdSet;
   diReady := SocketSelect( maxFd + 1 , ADR(FdSetRun) , pSetTemp , pSetTemp , ADR(tmSlect) );
   IF diReady > 0 THEN 
     (* 新的连接请求 *)
     IF SocketFdIsSet( hSocketListen , ADR(FdSetRun) ) THEN
       hClientSocket := SocketAccept( hSocketListen , ADR(stClientAddress) , ADR(diClientAddressLen) );
       FOR i := 0 TO iNumMaxClient BY 1 DO 
         IF -1 = arrClient[i].hClientSocket THEN 
           arrClient[i].hClientSocket := hClientSocket;
           arrClient[i].dwRecvTime := GetTickCount();
           arrClient[i].dwIP := stClientAddress.sin_addr.addr;
           SocketInetNtoa( ADR(arrClient[i].dwIP) , ADR(arrClient[i].strIP) , SIZEOF(arrClient[i].strIP) );
           EXIT;
         END_IF;
       END_FOR;

​       (* 将新的连接句柄添加到集合中 *)
​       SocketFdSet( hClientSocket , ADR(FdSet) );
​       IF hClientSocket > maxFd THEN 
​         maxFd := hClientSocket;
​       END_IF;
​     END_IF;

​     (* 客户端连接数据到达 *)
​     FOR i := 0 TO iNumMaxClient BY 1 DO 
​       IF arrClient[i].hClientSocket >= 0 THEN 
​         IF SocketFdIsSet( arrClient[i].hClientSocket , ADR(FdSetRun) ) THEN
​           diRecvLen := SocketRecv( arrClient[i].hClientSocket , ADR(arrDataRecv) , SIZEOF(arrDataRecv) , 0 );
​           IF diRecvLen > 0 THEN 
​             arrClient[i].dwRecvTime := GetTickCount();

​             (* 将接收到的数据原封不动的返回 *)
​             diSendLen := SocketSend( arrClient[i].hClientSocket , ADR(arrDataRecv) , diRecvLen , 0 );
​             IF diSendLen > 0 THEN 
​               dwSendTotalLen := dwSendTotalLen + diSendLen;
​             END_IF;
​             dwRecvTotalLen := dwRecvTotalLen + diRecvLen;
​           END_IF;
​         END_IF;
​       END_IF;
​     END_FOR;
   END_IF;

   (* 超时检测 *)
   FOR i := 0 TO iNumMaxClient BY 1 DO 
     IF arrClient[i].hClientSocket >= 0 THEN 
       dwTime := GetTickCount();
       dwTime := dwTime - arrClient[i].dwRecvTime;
       IF dwTime > dwTimeout THEN 
         (* 关闭客户端连接,并将客户端连接句柄从集合中移除 *)
         SocketFdClr( arrClient[i].hClientSocket , ADR(FdSet) );
         SocketClose( arrClient[i].hClientSocket );
         arrClient[i].hClientSocket := -1;
         arrClient[i].dwRecvTime := 0;
         arrClient[i].dwIP := 0;
         arrClient[i].strIP := '';
       END_IF;
     END_IF;
   END_FOR;
END_IF;

(* 关闭服务器 *)
IF bServerClose THEN 
   bServerClose := FALSE;

   (* 将监听句柄从集合中移除 *)
   SocketFdClr( hSocketListen , ADR(FdSet) );
   SocketClose(hSocketListen);
   hSocketListen := -1;

   (* 将客户端连接句柄从集合中移除 *)
   FOR i := 0 TO iNumMaxClient BY 1 DO 
     IF arrClient[i].hClientSocket >= 0 THEN 
       SocketFdClr( arrClient[i].hClientSocket , ADR(FdSet) );
       SocketClose( arrClient[i].hClientSocket );
       arrClient[i].hClientSocket := -1;
       arrClient[i].dwRecvTime := 0;
       arrClient[i].dwIP := 0;
       arrClient[i].strIP := '';
     END_IF;
   END_FOR;
END_IF;

Socket综合示例-TCP客户端

  • 示例功能说明(例程路径:安装目录\example\TCP客户端)

TCP客户端,待连接的服务器端口为2000、IP为192.168.0.254,每次发送10字节数据并接收应答数据。

  • 变量定义
名称数据类型初始值注释
bClientSetupBOOL建立客户端
bClientCloseBOOL关闭客户端
bInitBOOLTRUE初始化客户端
bSendBOOL是否发送数据
bRecvBOOL是否接收数据
hSocketDINT套接字句柄
socket_familyDINTSOCKET_AF_INET
socket_typeDINTSOCKET_STREAM
socket_protocolDINTSOCKET_IPPROTO_TCP
iOptValueDINT选项值
iOprRetDINT
SockAddrClientsockaddr_in客户端连接地址信息
FdSetfd_set套接字事件监测集合
FdSetRunfd_set
maxFdDINT0
diReadyDINT
tmSlecttimeval
pSetTempPOINTER TO fd_set
wServerPortWORD2000服务器端口号
arrDataSendARRAY[0..255] OF BYTE[1,2,3,4,5,6,7,8,9,10,11,245(0)]待发送数据存放的内存
arrDataRecvARRAY[0..255] OF BYTE接收到的数据存放内存
diRecvLenDINT接收到的数据长度
diSendLenDINT发送的数据长度
dwRecvTotalLenDWORD累计接收到的数据长度
dwSendTotalLenDWORD累计发送的数据长度
dwExpectSendLenDWORD10期待发送的数据长度
strRemoteIPSTRING(15)'192.168.0.254'服务器IP地址
dwRemoteIPDWORD服务器IP地址
  • ST示例
IF bInit THEN 
    bInit := FALSE;

    hSocket := -1;
    bClientSetup := TRUE;
END_IF;

(* 创建一个客户端,并连接到服务器 *)
IF bClientSetup THEN 
    bClientSetup := FALSE;

    hSocket := Socket( socket_family , socket_type , socket_protocol);
    IF hSocket >= 0 THEN 
        (* 设置为阻塞模式 *)
        iOptValue := 0;
        iOprRet := SocketIoctl( hSocket , SOCKET_FIONBIO , ADR(iOptValue) );

        (* 连接到服务器 *)
        iOprRet := SocketInetAddr( ADR(strRemoteIP) , ADR(dwRemoteIP) );
        IF 0 = iOprRet THEN 
            SockAddrClient.sin_family := SOCKET_AF_INET;
            SockAddrClient.sin_port := SocketHtons( wServerPort );
            SockAddrClient.sin_addr.addr := dwRemoteIP;
            iOprRet := SocketConnect( hSocket , ADR(SockAddrClient) , SIZEOF(SockAddrClient) );
            IF 0 = iOprRet THEN 
                SocketFdZero( ADR(FdSet) );
                SocketFdSet( hSocket , ADR(FdSet) );
                IF hSocket > maxFd THEN 
                    maxFd := hSocket;
                END_IF;
            ELSE
                (* 连接失败则关闭创建的socket *)
                SocketClose( hSocket );
                hSocket := -1;
            END_IF;
        END_IF;
    END_IF;
END_IF;

(* 发送数据,并启动接收 *)
IF bSend THEN 
    bSend := FALSE;

    IF hSocket >= 0 THEN 
        diSendLen := SocketSend( hSocket , ADR(arrDataSend) , dwExpectSendLen , 0 );
        IF diSendLen > 0 THEN 
            dwSendTotalLen := dwSendTotalLen + diSendLen;
            bRecv := TRUE; //成功发送数据后 则启动接收
        END_IF;
    END_IF;
END_IF;

(* 接收数据,接收到数据后停止接收 *)
IF bRecv THEN 
    IF hSocket >= 0 THEN 
        tmSlect.tv_sec := 0;
        tmSlect.tv_usec := 10000;
        FdSetRun := FdSet;
        diReady := SocketSelect( maxFd + 1 , ADR(FdSetRun) , pSetTemp , pSetTemp , ADR(tmSlect) );
        IF diReady > 0 THEN 
            IF SocketFdIsSet( hSocket , ADR(FdSetRun) ) THEN
                diRecvLen := SocketRecv( hSocket , ADR(arrDataRecv) , SIZEOF(arrDataRecv) , 0 );
                IF diRecvLen > 0 THEN 
                    dwRecvTotalLen := dwRecvTotalLen + diRecvLen;
                    bRecv := FALSE;
                END_IF;
            END_IF;
        END_IF;
    END_IF;
END_IF;

(* 关闭一个客户端 *)
IF bClientClose THEN 
    bClientClose := FALSE;

    IF hSocket >= 0 THEN 
        (* 关闭socket,并将socket句柄从集合中移除 *)
        SocketFdClr( hSocket , ADR(FdSet) );
        SocketClose( hSocket );
        hSocket := -1;
    END_IF;
END_IF;

Socket综合示例-UDP服务器

  • 示例功能说明(例程路径:安装目录\example\UDP通讯)

UDP服务器,服务器端口为9000,将接收到的数据原封不动的返回。

  • 变量定义
名称数据类型初始值注释
bServerSetupBOOL启动服务器
bServerCloseBOOL关闭服务器
bInitBOOLTRUE初始化服务器
hSocketDINT套接字句柄
socket_familyDINTSOCKET_AF_INET
socket_typeDINTSOCKET_DGRAM
socket_protocolDINTSOCKET_IPPROTO_IP
ServerSockAddrsockaddr_in服务器地址结构
wServerPortWORD9000UDP服务器端口
iOprRetDINT
diOptValueDINT
dwFlagsDINT0
SockAddrRecvsockaddr_in接收到的socket地址信息
SockAddrSendsockaddr_in待发送的socket地址信息
diSockAddrSizeDINT
diRecvedLenDINT接收到的数据长度
dwRecvedTotalLenDWORD累计接收到的数据长度
diSentLenDINT发送的数据长度
dwSentTotalLenDWORD累计发送的数据长度
FdSetfd_set套接字事件监测集合
FdSetRunfd_set
maxFdDINT0
diReadyDINT
tmSlecttimeval
pSetTempPOINTER TO fd_set
diLastErrorDINT
arrRecvARRAY[0..255] OF BYTE接收到的数据存放内存
  • ST示例
IF bInit THEN 
   bInit := FALSE;
   
   hSocket := -1;
   bServerSetup := TRUE;
END_IF;

(* 启动服务器 *)
IF bServerSetup THEN 
   bServerSetup := FALSE;

   hSocket := Socket( socket_family , socket_type , socket_protocol);
   IF hSocket >= 0 THEN 
     diOptValue := 1;
     iOprRet := SocketSetOption( hSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(diOptValue), SIZEOF(diOptValue));

​     ServerSockAddr.sin_addr.addr := SOCKET_INADDR_ANY;
​     ServerSockAddr.sin_family := socket_family;
​     ServerSockAddr.sin_port := SocketHtons( wServerPort );
​     iOprRet := SocketBind( hSocket , ADR(ServerSockAddr) , SIZEOF(ServerSockAddr));
​     IF 0 = iOprRet THEN 
​       SocketFdZero( ADR(FdSet) );
​       SocketFdSet( hSocket , ADR(FdSet) );
​       IF hSocket > maxFd THEN 
​         maxFd := hSocket;
​       END_IF;
​     ELSE
​       SocketClose( hSocket );
​       hSocket := -1;
​     END_IF;
   END_IF;
   
END_IF;

(* 数据接收处理 *)
IF hSocket >= 0 THEN 
   tmSlect.tv_sec := 0;
   tmSlect.tv_usec := 10000;
   FdSetRun := FdSet;
   diReady := SocketSelect( maxFd + 1 , ADR(FdSetRun) , pSetTemp , pSetTemp , ADR(tmSlect) );
   IF diReady > 0 THEN 
     IF SocketFdIsSet( hSocket , ADR(FdSetRun) ) THEN
       diRecvedLen := SocketRecvfrom( hSocket , ADR(arrRecv) , SIZEOF(arrRecv) , dwFlags , ADR(SockAddrRecv), ADR(diSockAddrSize));
       IF diRecvedLen > 0 THEN 
         dwRecvedTotalLen := dwRecvedTotalLen + diRecvedLen;

​         (* 将接收到的数据原封不动的返回 *)
​         SockAddrSend.sin_addr.addr := SockAddrRecv.sin_addr.addr;
​         SockAddrSend.sin_family := SOCKET_AF_INET;
​         SockAddrSend.sin_port := SockAddrRecv.sin_port;
​         diSentLen := SocketSendto( hSocket , ADR(arrRecv) , diRecvedLen , dwFlags , ADR(SockAddrSend) , SIZEOF(SockAddrSend));
​         IF diSentLen > 0 THEN 
​           dwSentTotalLen := dwSentTotalLen + diSentLen;
​         ELSE
​           diLastError := GetLastError();
​         END_IF;
​       END_IF;
​     END_IF;
   END_IF;
END_IF;

(* 关闭服务器 *)
IF bServerClose THEN 
   bServerClose := FALSE;
   SocketFdClr( hSocket , ADR(FdSet) );
   SocketClose( hSocket );
   hSocket := -1;
END_IF;
网络通讯已经加载完毕