2 onps栈使用说明——ping、域名解析等网络工具测试

1. ping测试协议栈提供ping工具,其头文件为“net_tools/ping.h”,将其include进你的目标系统中即可使用这个工具 。
……#include "onps.h"#include "net_tools/ping.h"//* 回调函数,收到目标地址的应答报文后ping工具会调用这个函数完成用户的特定处理逻辑//* 针对这个测试 , 在这里就是简单地打印出了应答报文的内容以及ping的响应时间static voidping_recv_handler(USHORT usIdentifier,//* ping的标识id,响应报文与探测报文这个id应该一致in_addr_t unFromAddr,//* 响应报文的源地址USHORT usSeqNum,//* 响应报文序号,其与探测报文一致UCHAR *pubEchoData,//* 响应报文携带的响应数据 , 其与探测报文一致UCHAR ubEchoDataLen,//* 响应报文携带的数据长度UCHAR ubTTL,//* ttl值UCHAR ubElapsedMSecs)//* 响应时长,单位:秒,从发送探测报文开始计时到收到响应报文结束计时{CHAR szSrcAddr[20];struct in_addr stInAddr;stInAddr.s_addr = unFromAddr;printf("<Fr>%s, recv %d bytes, ID=%d, Sequence=%d, Data='https://www.huyubaike.com/biancheng/%s', TTL=%d, time=%dms\r\n",inet_ntoa_safe(stInAddr, szSrcAddr), //* 这是一个线程安全的ip地址转ascii字符串函数(UINT)ubEchoDataLen,usIdentifier,usSeqNum,pubEchoData,(UINT)ubTTL,(UINT)ubElapsedMSecs);}int main(void){if(open_npstack_load(&enErr)){printf("The open source network protocol stack (ver %s) is loaded successfully. \r\n", ONPS_VER);//* 协议栈加载成功,在这里初始化ethernet网卡或等待ppp链路就绪#if 0emac_init(); //* ethernet网卡初始化函数,并注册网卡到协议栈#elsewhile(!netif_is_ready("ppp0")) //* 等待ppp链路建立成功os_sleep_secs(1);#endif}else{printf("The open source network protocol stack failed to load, %s\r\n", onps_error(enErr));return -1;}//* 启动ping测试USHORT usSeqNum = 0;UINT unErrCount = 0;INT nPing = ping_start(&enErr);if(nPing < 0){//* 启动失败 , 输出一条日志信息printf("ping_start() failed, %s\r\n", onps_error(enErr));return -1;}while(TRUE && usSeqNum < 100){//* ping目标地址INT nRtnVal = ping(nPing, inet_addr("192.168.0.2"), usSeqNum++, 64, GetElapsedMSecs, ping_recv_handler, 3, &enErr);if(nRtnVal <= 0) //* ping返回一个错误{//* 累计ping错误数unErrCount++;//* 控制台打印当前错误数printf("no reply received, the current number of errors is %d, current error: %s\r\n", unErrCount, nRtnVal ? onps_error(enErr) : "recv timeout");}os_sleep_secs(1);}//* 结束ping测试ping_end(nPing);return 0;}上述示例代码调用了ping测试工具提供的几个api函数 。ping_start()函数的调用非常简单,其功能就是开启ping测试 。结束ping测试需要调用ping_end()函数,否则ping测试会一直占用协议栈资源 。这几个函数的说明如下:
函数原型
INT ping_start(EN_ONPSERR *penErr);
功能
启动ping测试 。注意,启动后你可以随时更换目标地址,不必拘泥于一个固定的目标地址 。
参数

  • penErr:如果启动失败,该参数用于接收具体的错误码
返回值
成功 , 返回当前启动的ping测试任务的句柄;失败,返回值小于0,具体错误信息参看pennErr保存的错误码 。
-
函数原型
void ping_end(INT nPing);
功能
结束ping测试,释放占用的协议栈资源 。
参数
  • nPing:ping_start()函数返回的ping测试句柄
返回值

-
函数原型
INT ping(INT nPing,
in_addr_t unDstAddr,
USHORT usSeqNum,
UCHAR ubTTL,
UINT(*pfunGetCurMSecs)(void),
void(*pfunRcvHandler)(USHORT usIdentifier,
in_addr_t unFromAddr,
USHORT usSeqNum,
UCHAR *pubEchoData,
UCHAR ubEchoDataLen,
UCHAR ubTTL,
UCHAR ubElapsedMSecs),
UCHAR ubWaitSecs,
EN_ONPSERR *penErr);
功能
ping目标地址并等待接收对端的响应报文 。其功能与通用的ping测试工具完全相同 。
参数
  • nPing:ping_start()函数返回的ping测试句柄
  • unDstAddr:目标地址
  • usSeqNum:报文序号 , 用于唯一的标识发出的探测报文
  • ubTTL:ttl值 , 探测报文到达目标地址之前的生存时间
  • pfunGetCurMSecs:函数指针,这个函数返回系统定时器自启动以来的工作时长,单位:毫秒,其精度取决于os定时器粒度,其用于统计
  • ping的响应时间,必须提供这个函数,否则ping操作将无法完成
  • pfunRcvHandler:函数指针,收到响应报文后将调用这个函数完成用户指定的操作 , ping_recv_handler()就是它的实际实现
  • ubWaitSecs:响应报文的最长等待时间,单位:秒
  • penErr:如果ping失败,该参数保存具体的错误码
返回值
大于0,ping成功;0,等待响应报文超时;小于0,失败 , 具体的错误信息参看pennErr保存的错误码 。

推荐阅读