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服务器的计算机名(可设为 ...
随机推荐
- 【java】学习路线6-静态方法、私有化方法、父类子类
import java.util.Arrays; /* 我们可以自己创建方法(静态) 私有化方法,阻止他人实例化该方法 静态代码块只执行一次,只在加载这个所在类的时候执行 父类 - 子类 子类继承自父 ...
- Util和Helper类
Util和Helper Util Util类,应该是一个无状态的类,只有静态方法. 比如在获取某些类的全局实例化对象的时候可以使用. public class ParamUtil { ... publ ...
- Python入门系列(三)一学就会-基础数据类型
数据类型 您可以使用type()函数获取任何对象的数据类型. x = 5 print(type(x)) 数字类型 x = 1 # int y = 2.8 # float z = 1j # comple ...
- K8S Pod及其控制器
Pod K8S里能够运行的最小逻辑单元,1个Pod可以运行多个容器 Pod 控制器 Pod控制器是Pod启动的一种模版,用来保证在K8S中启动的Pod始终按照人们的预期运行(副本数,生命周期.健康状态 ...
- Macos下用pycharm运行django项目死活安装不上mysqlclient怎么办!!??
花了我三天时间,佛了 我刚从win过渡到mac,想着把代码迁移一下. 然后看到依赖里面有一个mysqlclient,然后pip3 install死活装不上 解决方案: 在这里写上这个 然后就好,死了
- Pytorch: repeat, repeat_interleave, tile的用法
https://zhuanlan.zhihu.com/p/474153365 torch.repeat 使张量沿着某个维度进行复制, 并且不仅可以复制张量,也可以拓展张量的维度: import tor ...
- 放弃 Electron,拥抱 WebView2!JavaScript 快速开发独立 EXE 程序
Electron 不错,但也不是完美的. Electron 带来了很多优秀的桌面软件,但并不一定总是适合我们的需求. 多个选择总是好事! 我使用 Electron 遇到的一些麻烦 1.Electron ...
- Windows 2012 R2上搭建IIS管理用户的隔离模式FTP
Windows 2012 R2上搭建IIS管理用户的隔离模式FTP Windows自带的FTP现在可以提供基于非OS用户的管理,这提高了安全性.即使FTP用户名和密码泄露,也不会对操作系统造成进一步的 ...
- 2021年3月-第01阶段-Linux基础-Linux系统概念-Linux命令
Linux系统基本概念 图形界面: Ctrl+Shift +号 //调整命令终端变大 Ctrl - 号 //调整命令终端变小 命令终端: ~ 家目录:用户的私有场所,其他用户不能随便访问 root超级 ...
- js中的对象和数组的创建
<!DOCTYPE html><html><head> <title>获取控制</title> <meta charset=" ...