onps栈使用说明(2)——ping、域名解析等网络工具测试
1. ping测试
协议栈提供ping工具,其头文件为“net_tools/ping.h”,将其include进你的目标系统中即可使用这个工具。
……
#include "onps.h"
#include "net_tools/ping.h"
//* 回调函数,收到目标地址的应答报文后ping工具会调用这个函数完成用户的特定处理逻辑
//* 针对这个测试,在这里就是简单地打印出了应答报文的内容以及ping的响应时间
static void ping_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='%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 0
emac_init(); //* ethernet网卡初始化函数,并注册网卡到协议栈
#else
while(!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测试。注意,启动后你可以随时更换目标地址,不必拘泥于一个固定的目标地址。 参数
返回值 成功,返回当前启动的ping测试任务的句柄;失败,返回值小于0,具体错误信息参看pennErr保存的错误码。 - 函数原型 void ping_end(INT nPing); 功能 结束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测试工具完全相同。 参数
返回值 大于0,ping成功;0,等待响应报文超时;小于0,失败,具体的错误信息参看pennErr保存的错误码。 |
2. dns测试
这个测试需要为网卡设定好能够访问互联网的网关、DNS服务器地址等配置信息。当然如果采用dhcp动态地址申请的方式能够得到这些信息那就更省事了。dns查询工具的头文件为"net_tools/dns.h"。
……
#include "onps.h"
#include "net_tools/ping.h"
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 0
emac_init(); //* ethernet网卡初始化函数,并注册网卡到协议栈
#else
while(!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;
}
//* dns查询测试
in_addr_t unPrimaryDNS, unSecondaryDNS;
INT nDnsClient = dns_client_start(&unPrimaryDNS, &unSecondaryDNS, 3, &enErr);
if(nDnsClient < 0)
{
//* dns客户端启动失败,输出一条错误日志
printf("%s\r\n", onps_error(enErr));
}
else
{
//* 发送查询请求并等待dns服务器的应答
in_addr_t unIp = dns_client_query(nDnsClient, unPrimaryDNS, unSecondaryDNS, "gitee.com", &enErr);
if(unIp) //* 查询成功
{
CHAR szAddr[20];
printf("The ip addr: %s\r\n", inet_ntoa_safe_ext(unIp, szAddr));
}
else
printf("%s\r\n", onps_error(enErr)); //* 查询失败
//* 结束dns查询,释放占用的协议栈资源
dns_client_end(nDnsClient);
}
return 0;
}
与ping测试工具相同,dns查询工具同样提供了一组简单的api函数用于实现域名查询。这一组函数包括dns_client_start()、dns_client_end()以及dns_client_query(),其使用说明如下:
函数原型 INT dns_client_start(in_addr_t *punPrimaryDNS, in_addr_t *punSecondaryDNS, CHAR bRcvTimeout, EN_ONPSERR *penErr); 功能 启动一个域名查询客户端。 参数
返回值 成功,返回当前启动的dns客户端的句柄;失败,返回值小于0,具体错误信息参看pennErr保存的错误码。 - 函数原型 void dns_client_end(INT nClient); 功能 结束dns客户端,释放占用的协议栈资源。 参数
返回值 无 - 函数原型 in_addr_t dns_client_query(INT nClient, in_addr_t unPrimaryDNS, in_addr_t unSecondaryDNS, const CHAR *pszDomainName, EN_ONPSERR *penErr); 功能 发送dns查询请求,并等待服务器的响应报文,功能与通用的dns客户端完全相同。 参数
返回值 成功,返回域名对应的ip地址;失败,返回值为0,具体错误信息参看pennErr保存的错误码。 |
3. sntp网络校时测试
与dns的测试要求一样,要进行这个测试依然要确保你的开发板在物理层能够访问互联网,同时你的开发板支持rtc,并提供一组rtc操作函数,包括读取、设置系统当前时间等api。这里假设你的测试环境已经具备上述测试条件。sntp网络校时工具的头文件为"net_tools/sntp.h"。
……
#include "onps.h"
#include "net_tools/sntp.h"
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 0
emac_init(); //* ethernet网卡初始化函数,并注册网卡到协议栈
#else
while(!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;
}
//* 先设定个不合理的时间,以测试网络校时功能是否正常,由rtc驱动提供,负责修改系统当前时间
//* RTC前缀的函数为目标系统应提供的rtc时钟操作函数
RTCSetSysTime(22, 9, 5, 17, 42, 30);
//* 开启网络校时,sntp_update_by_ip()与sntp_update_by_dns()均可使用
ST_DATETIME stDateTime;
#if 1
if(sntp_update_by_ip("52.231.114.183", NULL, RTCSetSystemUnixTimestamp, 8, &enErr)) //* ntp服务器地址直接校时
#else
if(sntp_update_by_dns("time.windows.com", Time, RTCSetSystemUnixTimestamp, 8, &enErr)) //* ntp服务器域名方式校时
#endif
{
//* 获取系统时间,检查校时结果
RTCGetSysTime(&stDateTime);
//* 控制台输出当前系统时间
printf("The time is %d-%02d-%02d %02d:%02d:%02d\r\n", stDateTime.usYear, stDateTime.ubMonth,
stDateTime.ubDay, stDateTime.ubHour, stDateTime.ubMin, stDateTime.ubSec);
}
else
{
printf("%s\r\n", onps_error(enErr));
return -1;
}
return 0;
}
测试代码首先把时间设定在了2022年9月5日17点42分30秒,目的是为了验证目标系统时间是否会被成功校正。测试代码用到了目标系统应提供的一组rtc时钟操作函数。其中RTCSetSysTime()用于设置系统时间。RTCSetSystemUnixTimestamp()函数同样也是设置系统时间,只不过是通过unix时间戳进行设置。RTCGetSysTime()函数用于读取当前系统时间。相较于ping及dns工具,sntp网络校时工具只提供了一个接口函数sntp_update_by_xx()即可完成校时。我们可以通过ntp服务器地址也可以通过ntp服务器域名进行校时。该函数的详细使用说明如下:
函数原型 BOOL sntp_update_by_ip(const CHAR *pszNtpSrvIp, time_t(*pfunTime)(void), void(*pfunSetSysTime)(time_t), CHAR bTimeZone, EN_ONPSERR *penErr); 功能 发送一个校时请求到pszNtpSrvIp参数指定的ntp服务器,并等待服务器的响应报文,完成校时操作。 参数
返回值 校时成功,返回TRUE;失败,返回FALSE,具体错误信息参看pennErr保存的错误码。 |
sntp_update_by_dns()函数与sntp_update_by_ip()函数除了第一个入口参数变成了域名外,其它完全相同,不再赘述。
onps栈使用说明(2)——ping、域名解析等网络工具测试的更多相关文章
- onps栈使用说明(1)——API接口手册
1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...
- onps栈使用说明(3)——tcp、udp通讯测试
4. tcp客户端 在协议栈源码工程下,存在一个用vs2015建立的TcpServerForStackTesting工程.其运行在windows平台下,模拟实际应用场景下的tcp服务器.当tcp客户端 ...
- onps栈移植说明(1)——onps栈的配置及裁剪
onps栈的移植涉及几个部分:1)系统配置及裁剪:2)基础数据类型定义:3)RTOS适配层实现:4)编写网卡驱动并注册网卡.本文作为onps栈移植的指导性文件将给出一般性的移植说明及建议,具体的移植样 ...
- linux下使用screen和ping命令对网络质量进行监控
linux下使用screen和ping命令对网络质量进行监控 场景:应用连接云服务器经常偶尔会出现连接不上的情况,android和IOS端连接的时候也会出现tcp延时5秒以上,现在想验证是否是云服务商 ...
- 使用ping网络工具编写Shell脚本程序实现网络连接故障初步排查
在学习ping命令的时候,突发奇想:为何不使用ping命令对网络连接故障进行排查? 具体思路: 1. ping 127.0.0.1 (虚拟网卡地址)以检查主机的TCP/IP协议栈是否正常. 2. p ...
- (转)用C#实现实现简单的 Ping 的功能,用于测试网络是否已经连通
本文转载自:http://blog.csdn.net/xiamin/archive/2009/02/14/3889696.aspx 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通 1 ...
- Android设备网络压力测试
网络测试的几个维度: 网络的性能 带宽:通过TCP测试来量度 时延:用ping命令量度 数据报丢失:用Iperf UDP测试来量度 Jitter(延时变化):用Iperf UDP测试来量度 信号强度( ...
- linux ping IP地址与telnet 测试IP端口
ping命令是不能够测试端口的,ping只是测试网络联接状况以及信息包发送和接收状况. 格式:ping IP地址或主机名 [-t] [-a] [-n count] [-l size] 参数含义:-t不 ...
- Network基础(一):配置计算机名及工作组、TCP/IP地址配置、网络连通性测试
一.配置计算机名及工作组 目标: 本例要求为修改计算机名并加入工作组: 设置计算机名:姓名拼音 设置工作组名:TARENA-NETWORK 方案: 修改Windows 2008服务器的计算机名(可设为 ...
随机推荐
- 面试突击78:@Autowired 和 @Resource 有什么区别?
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解.它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见 ...
- 诺塔斯读写卡QT SDK笔记
卡片操作函数调用 寻卡: Request --> LotusCardRequest 防撞处理: Anticollission --> LotusCardAnticoll 选卡: Selec ...
- Jmeter中的JSON提取器用法
一.使用前提 一般来说JSON提取器只适用于响应结果中返回的是json数据 二.需求 在下一个接口调用上一个接口的数据,如:请求1返回的结果,处理以后作为请求2的参数使用. 首先需要下载JSON Ex ...
- Java SE final关键字
final关键字 final可以修饰类.属性.方法和局部变量 如下情况,可以使用final 当不希望类被继承时,可以用final修饰 当不希望父类的某个方法被子类覆盖/重写(override)时,可以 ...
- docker bridge 到 k8s pod 跨节点网络通信机制演进
- 如何从Django项目中删除或隐藏应用
1.项目的settings.py文件 INSTALLED_APPS中删除或者注释掉,这是针对数据库这一块儿的 2.项目的urls.py文件 删除或这注释掉应用的路径导入 urlpatterns中删除或 ...
- Kubernetes ConfigMap热更新
ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中. 总结 更新 ConfigMap 后: 使用该 ConfigMap 挂载的 Env 不会同步更新 ...
- mac通过docker一键部署Jenkins
目录 mac通过docker一键部署Jenkins 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.下载脚本 1.2.安装程序 1.2.1.安装程序详情 1 ...
- mac通过docker一键部署MySQL8
目录 mac通过docker一键部署MySQL8 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.克隆脚本 1.2.安装程序 1.2.1.安装程序详情 1. ...
- Kafka 之producer拦截器(interceptor)
Kafka 之producer拦截器(interceptor) 一.拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制 ...