基于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系统-高并发部分
什么是高并发? 狭义来讲就是你的网站/软件同一时间能承受的用户数量有多少 相关指标有 并发数:对网站/软件同时发起的请求数,一般也可代表实际的用户 每秒响应时间:常指一次请求到系统正确响的时间(以秒为 ...
随机推荐
- 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代码如下: static int __in ...
- 规则集之探究何时使用HashSet、LinkedHashSet以及TreeSet?
前言 Java集合框架三种主要类型的集合:规则集(Set).线性表(List).队列(Queue).Set用来存储不可重复的元素:List用来存储有元素构成的有序的集合:而Queue则用于存储用先进先 ...
- 【Java IO流】字节流和字符流详解
字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作——也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3 ...
- c# DateTime 类
获得当前系统时间: DateTime dt = DateTime.Now;Environment.TickCount可以得到"系统启动到现在"的毫秒值DateTime now = ...
- [转载]Word直接发布新浪博客(以Word 2013为例)
原文地址:Word直接发布新浪博客(以Word 2013为例)作者:paulke2011 注意:这篇博客直接由Word 2013发出!这虽然也算是一个教程,但更多的是一个试验品. 老早就知道Word有 ...
- 团队作业8——第二次项目冲刺(Beta阶段)5.21
1.当天站立式会议照片 会议内容: 本次会议为第三次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:检查总结第二次任务完成情况 ②:布置第三次任务的详细分工 ③:规定完成时间是在第四次任务之前 ④ ...
- 201521123083 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. protec ...
- 201521123113《Java程序设计》第8周学习总结
1. 本周学习总结 2. 书面作业 本次作业题集集合 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 remove函数中,开始我的写法是 for(int i=0;i<list.s ...
- 201521123065《java程序设计》第七周学习总结
1. 本周学习总结 1.Iterator迭代器用于遍历集合中的元素: 2.使用迭代器删除元素一定要先指向下一个元素在删除第一个元素: 3.List可以有重复对象: Set不能有重复对象: 4.Map是 ...
- Python[小甲鱼009了不起的分支和循环3]
for语句语法: for 目标 in 表达式: 循环体 例子1: favourite = 'Idmask' for i in favourite: print(i, end= ' ') 上面的输出结果 ...