基于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系统-高并发部分
什么是高并发? 狭义来讲就是你的网站/软件同一时间能承受的用户数量有多少 相关指标有 并发数:对网站/软件同时发起的请求数,一般也可代表实际的用户 每秒响应时间:常指一次请求到系统正确响的时间(以秒为 ...
随机推荐
- [ASP.NET MVC] Razor 布局
整体视图模板 View模板会先找到对应的controller文件,再找此文件下的Shared文件夹. 比如项目最外层的View/Shared 目录下有一个_Layout.cshtml模板页,有这样代码 ...
- poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
- 手机端rem适应
这段时间做了几个手机版的项目,因为没有用框架,所以用rem来做适应,下面就分享一下 //第一种是比较简单的代码 (function(win) { resizeRoot(); function resi ...
- MFS文件系统的组成
1. 元数据服务器.在整个体系中负责管理管理文件系统,目前MFS只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当.希望今后MFS能支持多个master服务器,进一 ...
- 201521123001《Java程序设计》第2周学习总结
本周学习总结 码云可以很方便地储存我们写好的代码,不用在写代码的时候担心没带U盘 Java中有许多已经写好的具有特定功能的一段独立小程序,不需要每一个函数都自己编写 Java的float型和C语言的不 ...
- 201521123003《Java程序设计》第2周学习总结
1. 本章学习总结 你对于本章知识的学习总结 学习了java中各种数据类型的使用 掌握了基本类型的转换 了解string和stringbuilder的区别以及字符串池的原理 学会了使用package管 ...
- JAVA课程设计——“小羊吃蓝莓”小游戏
JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...
- java课程设计(个人)--五子棋
1.团队课程设计博客链接 http://www.cnblogs.com/mz201521044152/p/7065575.html 2.个人负责模块说明 棋盘类,绘制棋盘,绘制棋子,按钮设置,鼠标监听 ...
- 用Beautifulsoup 来爬取贴吧图片
import urllib.request import bs4 import re import os url="https://tieba.baidu.com/p/1988291937? ...
- SpringAop详解
近几天学习了一下SpringAop在网上找了一些资料,此链接为原文链接http://www.cnblogs.com/xrq730/p/4919025.html AOP AOP(Aspect Orien ...