1 onps栈使用说明——API接口手册( 九 )


入口参数

  • hSocketSrv:tcp服务器的socket句柄
  • nWaitSecs:等待时长,单位:秒 。0,不等待,立即返回;大于0,等待指定时间直至收到一个/多个客户端数据到达信号或超时;小于0,一直等待,直至收到一个/多个客户端数据到达信号或协议栈报错
  • penErr:指向错误编码的指针,函数执行失败时该参数用于接收实际的错误码
返回值
返回已经收到数据的tcp客户端的socket句柄;当没有任何tcp客户端收到数据或协议栈报错时返回INVALID_SOCKET,具体的错误码通过penErr参数获得 。
示例
//* 完成tcp服务器的数据读取工作void tcp_server_recv(void *pvData){SOCKET hSockClt;EN_ONPSERR enErr;INT nRcvBytes;UCHAR ubaRcvBuf[100];while(TRUE){hSockClt = tcpsrv_recv_poll(l_hSockSrv, 1, &enErr);if(INVALID_SOCKET != hSockClt) //* 有效的socket{//* 注意这里一定要尽量读取完毕该客户端的所有已到达的数据,因为每个客户端只有新数据到达时才会触发一个信号到用户层//*,如果你没有读取完毕就只能等到该客户端送达下一组数据时再读取了,这可能会导致数据处理延迟问题while(TRUE){//* 读取数据nRcvBytes = recv(hSockClt, ubaRcvBuf, 256);if(nRcvBytes > 0){//* 原封不动的回送给客户端,利用回显来模拟服务器回馈应答报文的场景send(hSockClt, ubaRcvBuf, nRcvBytes, 1);}else //* 已经读取完毕{if(nRcvBytes < 0){//* 协议栈底层报错,这里需要增加你的容错代码处理这个错误并打印错误信息printf("%s\r\n", onps_get_last_error(hSocket, NULL));}break;}}}else //* 无效的socket{//* 返回一个无效的socket时需要判断是否存在错误,如果不存在则意味着1秒内没有任何数据到达,否则打印这个错误if(ERRNO != enErr)printf("tcpsrv_recv_poll() failed, %s\r\n", onps_error(enErr));}}}返回目录
socket_get_last_error/onps_get_last_error功能
获取socket最近一次发生的错误,包括描述信息及错误编码 。该函数其实是前面示例代码中出现的onps_get_last_error()函数的二次封装,功能及使用方式与之完全相同 。
原型
const CHAR *socket_get_last_error(SOCKET socket, EN_ONPSERR *penErr);
入口参数
  • socket:socket句柄
  • penErr:指向错误编码的指针,该参数用于接收实际的错误码
返回值
返回值为字符串指针,指向socket最近一次发生的错误描述字符串 。
示例
略 。
返回目录
socket_get_last_error_code功能
获取socket最近一次发生的错误编码 。
原型
EN_ONPSERR socket_get_last_error_code(SOCKET socket);
入口参数
  • socket:socket句柄
返回值
返回值为socket最近一次发生的错误编码 。
示例
略 。
返回目录
3. 常用工具函数协议栈还提供了一组网络编程常见的工具函数以供用户使用,同时还提供了一些常用的比如字符串操作、16进制格式化转换输出等函数:
  • htonxx系列:网络字节序转换函数
  • inet_xx系列:网络地址转换函数
  • ip_addressing:检查ip地址是否在同一网段
  • strtok_safe:线程安全的strtok函数
  • snprintf_hex:将16进制数据格式化转换成字符串
  • printf_hex:将16进制数据格式化转换成字符串后输出到控制台
  • onps_error:将协议栈返回的错误码转换成具体的描述字符串
htonll功能
实现64位长整型数的网络字节序转换 。
原型
LONGLONG htonll(LONGLONG llVal);
入口参数
  • llVal:64位长整型数
返回值
返回值为字节序转换后的64位长整型数 。
示例
略 。
返回目录
htonl功能
实现32位整型数的网络字节序转换 。

经验总结扩展阅读