13. M601 socket的使用

1 socket相关API

在 OpenCPU 方案中,开发者可使用 Socket API 接口函数实现 TCP/UDP 编程,最多可建立 8 路 Socket 连接,这些 API 接口函数定义在 zyf_socket.h 文件中。

1.1 用法

TCP 客户端编程步骤如下:
步骤 1:注册。调用 ZYF_SocketRegister 接口函数注册 socket 的回调函数。
步骤 2:创建 socket。调用 ZYF_SocketCreate 去创建一个 socket,“contextId”参数必须 ZYF_GprsRegister 接口使用同一个。“socketType”必须设置为 SOC_TYPE_TCP。
步骤 3:链接 socket。调用 ZYF_SocketConnect 接口函数去请求 socket链接。在步骤 1 中注册的回调函数中 SOC_CONNECT 消息会提示链接是否成功。
步骤 4:通过 socket 发送数据。调用 ZYF_SocketSend 去发送数据。在数据发送出去后,可以调用 ZYF_SocketGetAckNumber 接口去查询服务器是否已经收到数据。如果 ZYF_SocketSend 返回 SOC_WOULDBLOCK,App 必须等待收到步骤1 中注册的回调函数中的 SOC_WRITE 消息之后才能再次发送数据。
步骤 5:从 socket 接收数据。当服务器发数据给设备时,socket 会收到回调函数中的 SOC_READ 消息通知。此时可调用ZYF_SocketRecv 接口用于接收数据。App 必须读完所有数据,否则当有新数据来时,回调函数消息 SOC_READ 将接收
不到。
步骤 6:关闭 socket。调用 ZYF_SocketClose 接口函数关闭 socket。处理完数据后,而 socket 又不需要保持连接状态,则 App 可以调用此接口去关闭socke。或者,当 App 收到 SOC_CLOSE 消息通知时,说明服务器端关闭了 socket,在这种情况下,也必须调用 ZYF_SocketClose 来关闭客户端的 socket。

1.2 函数API

1.2.1 SocketRegister

该函数为指定的套接字注册回调函数。
·函数原型
int32_t ZYF_SocketRegister(int32_t socketId, ZYF_SocketCallBack_t Callback);
·参数

callback:Socket 的回调函数
socketId:ZYF_SocketCreate()的返回值
·返回值
socketId 或其他错误代码。 要获取更多信息,请参阅 Enum_SocErrCode。

1.2.2 SocketCreate

此函数创建一个 socketID,取值范围最大为 6。
·函数原型
int32_t ZYF_SocketCreate(uint8_t socketType);
·参数
socketType:socket 的类型
·返回值
成功:socketId(等于或大于 0),失败:负数。参考 Enum_SocErrCode。

1.2.3 SocketClose

此函数用来关闭指定的 socketId。
·函数原型
int32_t ZYF_SocketClose(int32_t socketId);
·参数
socketId:需要被关闭的 socketID。
·返回值
如果函数成功,则此返回值将为 SOC_SUCCESS(0);否则,返回值为 0。 否则将返回负数(错误代码)。

1.2.4 SocketConnect

此功能连接到 TCP 服务器。 服务器由 IP 地址和端口号指定。
·函数原型
int32_t ZYF_SocketConnect(int32_t socketId, uint8_t *ipAddr, uint16_t ipPort);

·参数
socketId:socketId
ipAddr:指向 IPv4 地址的地址指针。 请参阅用法示例。
ipPort:目标端口号。
·返回值
SOC_SUCCESS:函数成功。SOC_WOULDBLOCK:此返回值用于无阻塞模式。 这意味着操作正在进行中,需要等待 callback_socket_connect()获得结果。
其他值:错误代码,请参考 Enum_SocErrCode。

1.2.5 SocketSend

此函数用来给一个连接上的 TCP 套接字发送数据。
·函数原型
int32_t ZYF_SocketSend(int32_t socketId, uint8_t* pData, int32_t dataLen);
·参数
socketId:接收方 socketID。
pData:数据的指针。
dataLen:数据的长度。
·返回值
如果没有发生错误,则 ZYF_SocketSend 返回已发送的字节总数,该总数可以小于 dataLen 参数中请求发送的字节数。 否则,将返回 Enum_SocErrCode 的值。

1.2.6 SocketSendTo

该功能通过 UDP 套接字将数据发送给特定目标。
·函数原型
int32_t ZYF_SocketSendTo(int32_t socketId, uint8_t* pData, int32_t dataLen, uint8_t *ipAddr, uint16_t ipPort);
·参数
socketId:接收方 socketID。
pData:数据的指针。
dataLen:数据的长度。

ipAddr:指向目标套接字的地址。
ipPort:目标端口号。
·返回值
如果没有错误发生,则此函数返回实际发送的字节数。 否则,将返回Enum_SocErrCode 的值。

1.2.7 SocketGetAckNumber

该功能用于获取 TCP 套接字 ACK 编号。
·函数原型
int32_t ZYF_SocketGetAckNumber(int32_t socketId, int32_t *ackNum);
·参数
socketId:socketID。
ackNum:指向一个 int32_t 类型变量,该变量是 TCP ACK 编号的存储空间。
·返回值
如 果 没 有 错 误 发 生 , 则 此 返 回 值 为 SOC_SUCCESS() 。 否 则 , 返 回 值“Enum_SocErrCode”。

1.2.8 SocketRecv

该功能用于从绑定的套接字接收数据。
·函数原型
int32_t ZYF_SocketRecv(int32_t socketId, uint8_t* pBuffer, int32_t
bufferLen);
·参数
socketId:socketID。
pBuffer:用于保存接收数据的指针。
·返回值
如果没有错误发生,ZYF_SocketRecv 返回接收到的字节总数。否则,返回Enum_SocErrCode 的值。

1.2.9 SocketRecvFrom
该功能用于通过 TCP 套接字接收数据报数据。
·函数原型
int32_t ZYF_SocketRecvFrom(int32_t socketId, uint8_t *pBuffer, int32_t recvLen, uint8_t *ipAddr, uint16_t *ipPort);
·参数
socketId:socketID。
pBuffer:用于保存接收数据的指针。
recvLen:接收到的数据长度。
ipAddr:指向接收连接实体地址的缓冲区的可选指针。
ipPort:指向整数的可选指针,该整数包含连接实体的端口号。
·返回值
如果没有错误发生,ZYF_SocketRecv 返回接收到的字节总数。否则,返回Enum_SocErrCode 的值。

1.2.10 SocketListen
该函数将套接字置于一个状态,使得能够实时监听即将到来的连接。
·函数原型
int32_t ZYF_SocketListen(int32_t listenSocketId);
·参数
listenSocketId:需要被监听的 socketID。
·返回值
如果没有错误发 生 , 则此函数返 回 SOC_SUCCESS(0) 。否 则 ,返回Enum_SocErrCode 的值。

1.2.11 SocketAccept
允许在套接字上尝试连接。
·函数原型
int32_t ZYF_SocketAccept(int32_t listenSocketId, uint8_t *ipAddr, uint16_t ipPort);

·参数
listenSocketId:被监听的 socketID。
ipAddr:指向缓冲区的可选指针,该缓冲区用于接收连接实体的地址。
ipPort:指向整数的可选指针,该整数包含连接实体的端口号。
·返回值
如果未发生错误,则此函数返回一个套接字 ID,该套接字 ID 用于为 tcp 服务器发送数据。大于或等于零。否则,将返回 Enum_SocErrCode 的值。

1.2.12 GetIPByHostName
此函数用于检索与主机名相对应的主机 IP。
·函数原型
int32_t ZYF_GetIPByHostName(uint8_t contextId, char *hostName, ZYF_GetIpByNameCallBack_t callback);
·参数
contextId:OpenCPU 一次支持两个到目标主机的 PDP 环境。该参数可以为 0 或 1。
hostName:主机名。
callback:系统调用此回调以通知是否成功检索主机 IP。
·返回值
如果没有错误发生 , 则此函数返回 SOC_SUCCESS(0) 。 否 则 , 将返回Enum_SocErrCode 的值。

1.2.13 ConvertIpAddr
此函数用于检查 IP 地址是否为有效 IP 地址。 如果为“是”,则 IP 地址字符串的每个段都将转换为整数以存储在 ipaddr 参数中。
·函数原型
int32_t ZYF_ConvertIpAddr(uint8_t *addrString, uint8_t* ipAddr);
·参数
addrString:IP 地址字符串。
ipAddr:指向 IPv4 地址,每个字节存储从相应 IP 字符串转换而来的 IP 数字。
·返回值
如果没有错误发生 , 则此函数返回 SOC_SUCCESS(0) 。 否则 , 将返回Enum_SocErrCode 的值。

1.2.14 SocketSetOpt
设置文件描述符 sockfd 所引用的套接字的选项。 选项可能存在于多个协议级别。 它们始终位于最上层的套接字级别。
·函数原型
int32_t ZYF_SocketSetOpt(int32_t socketId, int level, int optname, const void *optval, int optlen);
·参数
socketId:socketId。
level:协议级别。
optname:配置名字。
optval:配置数值。
optlen:配置长度。
·返回值
如果没有错误发生,则此函数返回 SOC_SUCCESS(0)。 否则,将返回Enum_SocErrCode 的值。

1.2.15 SocketGetOpt
设置文件描述符 sockfd 所引用的套接字的选项。 选项可能存在于多个协议级别。 它们始终位于最上层的套接字级别。
·函数原型 int32_t ZYF_SocketGetOpt(int32_t socketId, int level, int optname,
const void *optval, int optlen);
·参数
socketId:socketId。
level:协议级别。
optname:配置名字。
optval:配置数值。
optlen:配置长度。
·返回值
如果没有错误发生,则此函数返回 SOC_SUCCESS(0)。 否则,将返回Enum_SocErrCode 的值。

2 socket例程介绍

参考下一节例程:TCP和UDP的使用。

猜你喜欢

转载自blog.csdn.net/w_hizyf_m/article/details/108355676