基于RTKLIB构建高并发通信测试工具
1、 RTKLIB基础动态库生成
RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,由日本东京海洋大学的高须知二开发。在博文《RTKLIB编译及RTCM数据读取样例》中,笔者详细介绍了RTKLIB基础库的编译方法及注意细节,并给出了RTCM数据读取的DEMO,读者可适当参考。
2、 基于RTKLIB构建高并发通信测试工具DEMO
在RTKLIB动态库的基础上,笔者利用其稳定的数据通信功能,尝试进行了高并发通信测试工具的编译工作,模拟了500个NtripClient客户端并发测试,样例代码如下所示。
void strsvr(int i)
{
strsvr_t *svr = (strsvr_t *)malloc(sizeof(strsvr_t));
int opt[] = { , , , , , , , };
int strs[] = { STR_NTRIPCLI };
double nemapos[] = { };
char *path[];
for (int i = ; i < ; i++)
path[i] = malloc(sizeof(char) * );
path[] = "a:a@127.0.0.1:10001/RTCM ";
char cmd[][] = { };
char cmds_p[][] = { };
strconv_t *conv[] = { };
strsvrinit(svr, );
strsvrstart(svr, opt, strs, &path, conv, cmd, cmds_p, nemapos);
while ()
{
trace(, "thread:%d,tick:%d,rec:%d,cnt:%d\n", i, svr->stream[].tick_i,svr->stream[].inb, svr->stream[].tickcnt);
sleepms();
}
}
extern int ThreadStart(LPTHREAD_START_ROUTINE t, LPVOID p)
{
DWORD dwReceiveGpsDataThreadID;
HANDLE hReceiveDataThread;
if (!(hReceiveDataThread = CreateThread(NULL,,t,p,, &dwReceiveGpsDataThreadID)))
{
CloseHandle(hReceiveDataThread);
return ;
}
return ;
}
int main(char argv)
{
traceopen("log.txt");
tracelevel();
for (int i = ; i < ; i++)
{
ThreadStart((LPTHREAD_START_ROUTINE)strsvr1, (LPVOID)i); Sleep();
}
getchar();
traceclose();
return ;
}
其中,strsvr函数是并发测试的基础函数,负责完成数据通信功能和日志记录功能;ThreadStart函数是创建线程的函数,用于创建线程,t为方法指针,p为参数指针。
值得注意的的是RTKLIB中,不同通信协议和模式的通信路径path参数的格式具有特定的要求,具体内容可参考stropen函数的注释,如下所示。
/* open stream -----------------------------------------------------------------
*
* open stream to read or write data from or to virtual devices.
*
* args : stream_t *stream IO stream
* int type I stream type
* STR_SERIAL = serial device
* STR_FILE = file (record and playback)
* STR_TCPSVR = TCP server
* STR_TCPCLI = TCP client
* STR_NTRIPSVR = NTRIP server
* STR_NTRIPCLI = NTRIP client
* STR_NTRIPC_S = NTRIP caster server
* STR_NTRIPC_C = NTRIP caster client
* STR_UDPSVR = UDP server (read only)
* STR_UDPCLI = UDP client (write only)
* STR_MEMBUF = memory buffer (FIFO)
* STR_FTP = download by FTP (raed only)
* STR_HTTP = download by HTTP (raed only)
* int mode I stream mode (STR_MODE_???)
* STR_MODE_R = read only
* STR_MODE_W = write only
* STR_MODE_RW = read and write
* char *path I stream path (see below)
*
* return : status (0:error,1:ok)
*
* notes : see reference [1] for NTRIP
* STR_FTP/HTTP needs "wget" in command search paths
*
* stream path ([] options):
*
* STR_SERIAL port[:brate[:bsize[:parity[:stopb[:fctr[#port]]]]]]
* port = COM?? (windows)
* tty??? (linuex, omit /dev/)
* brate = bit rate (bps)
* bsize = bit size (7|8)
* parity= parity (n|o|e)
* stopb = stop bits (1|2)
* fctr = flow control (off|rts)
* port = tcp server port to output received stream
*
* STR_FILE path[::T][::+start][::xseppd][::S=swap][::P={4|8}]
* path = file path
* (can include keywords defined by )
* ::T = enable time tag
* start = replay start offset (s)
* speed = replay speed factor
* swap = output swap interval (hr) (0: no swap)
* ::P={4|8} = file pointer size (4:32bit,8:64bit)
*
* STR_TCPSVR :port
* port = TCP server port to accept
*
* STR_TCPCLI addr:port
* addr = TCP server address to connect
* port = TCP server port to connect
*
* STR_NTRIPSVR [:passwd@]addr[:port]/mponit[:string]
* addr = NTRIP caster address to connect
* port = NTRIP caster server port to connect
* passwd= NTRIP caster server password to connect
* mpoint= NTRIP mountpoint
* string= NTRIP server string
*
* STR_NTRIPCLI [user[:passwd]@]addr[:port]/mpoint
* addr = NTRIP caster address to connect
* port = NTRIP caster client port to connect
* user = NTRIP caster client user to connect
* passwd= NTRIP caster client password to connect
* mpoint= NTRIP mountpoint
*
* STR_NTRIPC_S [:passwd@][:port]/mpoint
* port = NTRIP caster server port to accept
* passwd= NTRIP caster server password to accept
* mpoint= NTRIP mountpoint
*
* STR_NTRIPC_C [user[:passwd]@][:port]/mpoint
* port = NTRIP caster client port to accept
* user = NTRIP caster client user to accept
* passwd= NTRIP caster client password to accept
* mpoint= NTRIP mountpoint
*
* STR_UDPSVR :port
* port = UDP server port to receive
*
* STR_UDPCLI addr:port
* addr = UDP server or broadcast address to send
* port = UDP server or broadcast port to send
*
* STR_MEMBUF [size]
* size = FIFO size (bytes) ("":4096)
*
* STR_FTP [user[:passwd]@]addr/path[::T=poff[,tint[,toff,tret]]]]
* user = FTP server user
* passwd= FTP server password
* addr = FTP server address
* path = FTP server file path
* poff = time offset for path extension (s)
* tint = download interval (s)
* toff = download time offset (s)
* tret = download retry interval (s) (0:no retry)
*
* STR_HTTP addr/path[::T=poff[,tint[,toff,tret]]]]
* addr = HTTP server address
* path = HTTP server file path
* poff = time offset for path extension (s)
* tint = download interval (s)
* toff = download time offset (s)
* tret = download retry interval (s) (0:no retry)
*
*-----------------------------------------------------------------------------*/
基于RTKLIB构建高并发通信测试工具的更多相关文章
- Microsoft Orleans构建高并发、分布式的大型应用程序框架
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- nginx+lua+redis构建高并发应用(转)
nginx+lua+redis构建高并发应用 ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求. url请求nginx服务器,然后lua查询redis, ...
- 基于SOA的高并发和高可用分布式系统架构和组件详解
基于SOA的分布式高可用架构和微服务架构,是时下如日中天的互联网企业级系统开发架构选择方案.在核心思想上,两者都主张对系统的横向细分和扩展,按不同的业务功能模块来对系统进行分割并且使用一定的手段实现服 ...
- 基于 Golang 构建高可扩展的云原生 PaaS(附 PPT 下载)
作者|刘浩杨 来源|尔达 Erda 公众号 本文整理自刘浩杨在 GopherChina 2021 北京站主会场的演讲,微信添加:Erda202106,联系小助手即可获取讲师 PPT. 前言 当今时 ...
- Websocket全讲解。跨平台的通讯协议 !!基于websocket的高并发即时通讯服务器开发。
本博文,保证不用装B的话语和太多专业的语言,保证简单易懂,只要懂JAVAEE开发的人都可以看懂. 本博文发表目的是,目前网上针对Websocket的资料太散乱,导致初学者的知识体系零零散散,学习困难加 ...
- 使用ngx_lua构建高并发应用(1)
转自:http://blog.csdn.net/chosen0ne/article/details/7304192 一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apa ...
- tornado 采用 epoll 代理构建高并发网络模型
1 阻塞和非阻塞 对于阻塞和非阻塞,网上有一个很形象的比喻,就是说好比你在等快递,阻塞模式就是快递如果不到,你就不能做其他事情.非阻塞模式就是在这段时间里面,你可以做其他事情,比如上网.打游戏.睡觉 ...
- 个人项目开源之c++基于epoll实现高并发游戏盒子(服务端+客户端)源代码
正在陆续开源自己的一些项目 此为c++实现高并发的游戏盒子,平台问题需要迁移重构,所以有一些遗留问题,客户端异常断开没有处理,会导致服务器崩溃,还有基于快写代码编程平台实现的小程序切换,线程读写缓存没 ...
- 构建高并发&高可用&安全的IT系统-高并发部分
什么是高并发? 狭义来讲就是你的网站/软件同一时间能承受的用户数量有多少 相关指标有 并发数:对网站/软件同时发起的请求数,一般也可代表实际的用户 每秒响应时间:常指一次请求到系统正确响的时间(以秒为 ...
随机推荐
- Spring上传文件,图片,以及常见的问题
1. 在工程依赖库下添加文件上传jar包 commons-fileupload-1.2.2.jar commons-io-2.4.jar 2.在springMVC配置文件中配置视图解析multipar ...
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...
- 三种计算c#程序运行时间的方法
三种计算c#程序运行时间的方法 第一种: 利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 = S ...
- 半个月学习的it内容
1 基本头部标签: 1 head: HEAD里面主要放一些有关网页设置的相关语句-->2编码格式: 设置网页的字符集编码格式:GB2312,简体中文的编码格式 GBK:扩展的国标码,比国标码多 ...
- 结对编程1--基于GUI的四则运算题目生成器
最终项目详细代码(coding地址)/李志强的博客/我的详细代码/方言的博客 一.需求分析 1.实现之前项目的功能,如:除了整数之外,还要支持真分数的四则运算,真分数的运算,并且要求能处理用户的输入, ...
- 201521123082 《Java程序设计》第5周学习总结
201521123082 <Java程序设计>第5周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规 ...
- 201521123033《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. answer; 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4- ...
- 201521123051《Java程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. Java多线程同步的方法: (1)同步方法:即有synchronized关键字修饰的方法. 由于java的每个对象 ...
- 201521123109《java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...
- foreach_and_函数
foreach(对集合每个元素的引用 in 集合){}例: int[] a = new int[5]{1,2,3,4,5,}; foreach(int b in a) { //b就是a中的每个元素 } ...