20年技术沉淀,超过1000个案例的应用

各行各业不同规模企业正使用

产品介绍

联柯八佰核心技术Z-BOX平台于1996年在加拿大完成研发,1999年技术转让给Karunga公司,2002年Karunga公司在Nasdaq上市,2004年开始研究北美物流市场。

Z-BOX技术平台底层创始人ZackQiu,清华大学优秀研究生,1996年获得美国犹他州大学颁发的计算机专业硕士学位。拥有十余年的计算机系统研发和管理经验,曾在国家重大科研项目中获奖,具有丰富的美国和加拿大海外工作背景,通晓IT应用服务领域,并有丰富的公司管理和运营经营,已完成一家美国公司在Nasdaq上市。

2008年起投资中国,完成3PL及供应链的管理运营平台以及EDI信息交换技术,并进行二代产品的功能开发。

2009年1月,深圳市联柯八佰信息技术有限公司正式成立

2010年完成和嘉源锐信的合作

2013年成立柳州联柯八佰,作为研发基地,并开始进行Ola-B2B平台推广试点,实现供应链扁平化的并行管理模式。主要试点项目如下:1、与柳钢合作建设广西钢材运网平台,2、与柳药合作打造医药零担物流全新的管理模式和运营监管平台,3、与新宁物流合作推出商流服务平台。

2014年与广西新华书店集团合资成立广西欧拉物流有限公司,打造广西地区网络最完善的第三方“无车承运人”物流服务商。2015年与天富热电合作建设新疆煤炭运输网络平台。

2016年柳州+东莞两大研发基地,服务项目遍及全国13个省级地区,以及加拿大。

联柯八佰坚持开发自主知识产权的计算机网络信息平台,多年以来,形成了一套完全自主知识产权的计算机网络信息运营系统的平台zBox,并在此平台上创建了整套的应用B/S系统架构,包涵的成熟产品有:

1.服务端服务软件:
lnkHttpSvr: 基于HTTP协议的计算机网络信息的运用系统Web服务软件(AP Server),高性能,响应速度快,实现预加载数据到内存,数据越靠近CPU存取速度越快。
lnkDnsSvr: domain服务软件(DNS Server)
lnkOlaGpsSrv:GPS服务软件
lnkAgent: 后台计算服务
2.前端UI框架:
lnkUI :在浏览器端快速构建UI界面的js框架 ,模块化UI构建,快发维护简单。

技术特点:

1、c/c++强类型语言开发,二进制文件发布,内存级处理,运行速度快,高效安全

2、自主知识产权,代码全部自己研发,后端程序,前端程序均可调试每行代码,没有第三方许可或依赖

3、采用MVC软件设计典范:将业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑

4、丰富的组件模块。内存缓存;支持多线程;标准的ODBC模块封装;对json、xml等数据格式处理封装完善;email发送、httpclient、TCPclient独立组件方便调用...

5、独立的模块设计思路,避免重复开发,本地调用、跨网调用等特点,可以实现多台服务器分布部署,易开发,易扩展

6、标准规范、开发培训简单,高效开发, 高效运行, 低成本运维, 最少硬件投入

最新版本下载

下载zBox-SDK

当前版本:v2.17.11.8 发布日期:2017-11-08

更新日志

2017-11-08 更新**** 下载lnkSvr_20171108.7z

2017-08-21 更新**** 下载lnkSvr_20170821.7z

2017-07-20 更新**** 下载lnkSvr_20170720.7z

2017-02-17 更新**** 下载lnkSvr_20170217.7z

2016-11-02 更新**** 下载lnkSvr_20161102.7z

2016-10-29 更新**** 下载lnkSvr_20161029.7z

2016-09-20 更新**** 下载lnkSvr_20160920.7z

2016-09-09 更新**** 下载lnkSvr_20160909.7z

2016-08-18 更新**** 下载lnkSvr_20160818.7z

2016-07-01 更新**** 下载lnkSvr_20160701.7z

2015-11-03 更新**** 下载lnkSvr_20151103.7z

2015-04-20 更新**** 下载lnkSvr_20150420.7z

2015-03-02 更新**** 下载lnkSvr_20150302.7z

2015-02-13 更新**** 下载lnkSvr_20150213.7z

2015-01-24 更新**** 下载lnkSvr_20150124.7z

2014-06-10 更新**** 下载lnkSvr_20140610.7z

2014-05-04 更新**** 下载lnkSvr_20140504.7z

2014-04-30 更新**** 下载lnkSvr_20140430.7z

2014-03-05 更新**** 下载lnkSvr_20140305.7z

2014-01-16 更新**** 下载lnkSvr_20140116.7z

2013-12-18 更新**** 下载lnkSvr_20131218.7z

2013-10-25 更新**** 下载lnkSvr_20131025.7z

2013-09-28 更新**** 下载lnkSvr_20130928.7z

2013-08-13 更新**** 下载lnkSvr_20130813.7z

2013-07-11 更新**** 下载lnkSvr_20130711.7z

2013-04-15 更新**** 下载lnkSvr_20130415.7z

2013-03-13 更新**** 下载lnkSvr_20130313.7z

2013-02-27 更新**** 下载lnkSvr_20130227.7z

2012-12-26 更新**** 下载lnkSvr_20121226.7z

2012-12-18 更新**** 下载lnkSvr_20121218.7z

2012-11-19 更新**** 下载lnkSvr_20121119.7z

2012-11-06 更新**** 下载lnkSvr_20121106.7z

2012-10-29 更新**** 下载lnkSvr_20121029.7z

2012-10-18 更新**** 下载lnkSvr_20121018.7z

2012-10-07 更新**** 下载lnkSvr_20121007.7z

2012-09-27 更新**** 下载lnkSvr_20120927.7z

更早...

入门开发文档

1 开始使用zBox-SDK

1.1、准备开发环境和工具
Microsoft Windows、 Microsoft Visual Studio 2008、 Visual AssistX、 mysql-connector-odbc
1.2、zBox-SDK配置运行
将下载的zBox-SDK解压放入D盘,如 D:\lnkSvr\bin\
bin目录下的debug是开发环境,release是生产环境。
下载配置文件ini.7z开发测试环境放入debug,生产环境放入release目录,并做相应的配置修改
debug或release目录的lnkHttpSvr.exe是Web服务软件,配置好ini文件双击即可运行。通常我们在开发环境使用调试运行,在生产环境安装成window服务运行。
1.3、使用一个简单demo工程调试运行
下载zbox_project_demo.zip放入wwwroot目录,用Microsoft Visual Studio 2008打开ProjectTest.vcproj

右键项目->选择属性->设置调试参数,按F5运行


2 基于zBox-SDK开发应用程序的运行原理


B/S(Brower/Server)结构
1、工程文件在B/S结构模式下的分布和运行:
1).所有工程文件最终都是放到服务器端,浏览器发送请求到服务器,服务器端的http服务软件(lnkHttpSvr.exe)根据请求返回数据(html,js,css,image...)
2).dll文件是在服务器端的电脑上运行的,由lnkHttpSvr解析执行,使用的是服务器端电脑的cup,disk等等资源。
3).html、js、css、image等文件是通过网络从服务端发送到客户端在客户端电脑上运行的,由浏览器软件解析执行,使用的是客户端电脑的cup,disk等等资源。
4).注意开发的时候我们工作的电脑既是服务端又是客户端。

2、基于HTTP协议,HTTP协议特点如下:
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
也通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高http服务器的吞吐率
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
支持客户/服务器模式

lnkHttpSvr.exe应用WEB服务器


上图是lnkHttpSvr应用WEB服务器组成结构,它还支持如下的特性:
支持一个进程监听多个端口
支持多线程
支持多进程部署
支持根据域名或者端口自由指定运行根目录
支持静态文件,dll文件缓存到内存,提高IO性能
支持keep-alive、gzip压缩、自由设置ContentType等等
支持配置ssl

项目文件、DLL文件运行原理


请求文件按目录寻找加载执行,第一次从磁盘加载,后续从内存缓存中加载运行

DLL工程文件开发,按照?page=***&pcmd=***做命令动作路由映射,一个小模块3个类,6个文件做MVC模式规范编写
c***Proc类:用于参数page,pcmd作路由映射
c***Page类:用于控制输入、输出、视图界面以及其他控制调用
c***类:用于定义数据模型,与数据库交互,操作数据的增删改查,逻辑等


3 项目DLL开发及规范

DLL 工程结构和配置典型范例
		 cspProjectName
			 |
			 |---csp //待转换的 html 文件目录
			 |            |---csp_c //待转换的 html 文件转换成 cpp 文件目录
			 |---cspPrj---|---entities //C***.h C***.cpp
			 |            |---proc_page //C***Proc.h C***Proc.cpp C***Page.h C***Page.cpp
			 |            |---cspMain.cpp //DLL 工程入口文件,导出函数/类声明,工程实例化
			 |            |---appdomain.h //运用工程 cAppDomain 类头文件
			 |            |---appdomain.cpp //将各个类以名称形式映射成 httpserver 的 url 参数page=名称,解析调用          
			 |            |---const.h
			 |            |----const.cpp //常量、全局变量、全局函数
			 |
			 |---css //样式文件目录
			 |
			 |---js //js 文件目录
			 |
			 |---images //图片文件目录
			 |---_config.ini //该工程的配置文件

		 
工程配置文件_config.ini
		[DEFAULT]
		supportEmail=zackqiu@link800.com
		redir=csp/cspTrack.dll?page=home

		IsLogErr = TRUE
		ErrLogFile=_cspTrackErr.log

		IsLogTSQL=TRUE
		IsDebug=TRUE
		IsLog=TRUE

		TRACER=FALSE
		TRACERFILE=_cspTrackTracer.log

		[AUTHENTICATION]

		dbConn=DATABASE=dbname;Server=127.0.0.1;Port=3306;DRIVER={MySQL ODBC 5.1 Driver};
		UID=root;PWD=123456;OPTION=2049;charset=gbk;stmt=set names gbk

		[WEBPATH]
		workdir= cspTrack\csp\
		[END]
		
参看文档: link800软件开发-zbox项目工程DLL开发规范.pdf


4 项目DLL调试Debug及内存泄漏检测

Debug:
F5编译运行
F9设置断点
F10是逐过程调试,单步执行,不进入调用的其它函数
F11是逐语句调试,单步执行,进入调用的其它函数
内存泄漏检测:
		#ifdef _DEBUG
		#include "vld.h"
		#include "vldapi.h"
		#endif
		
		XPORT int Init(ckHttpServer *psvr, ckSession *pSn)
		{
		#ifdef _DEBUG
			VLDEnable();
		#endif
		
		//.....
		}
		 
具体设置参看文档: 下载内存泄漏检测.pdf


5 常用SDK组件的使用

		    /***********************
			*常用数据类型
			***********************/
			
			
			/***********************
			*POST\GET获取数据
			***********************/
			
		    //按名称获取GET/POST键对值
			char* getRequest(char *field) ;
			char* getRequest(char *field, int &val);
			char* getRequest(char *field, double &val);
			char* getRequest(char *field, bool &val);
			char* getRequest(char *field, cString &val);
			char* getRequest(char *field, char **val);
			char* getRequest(char *field, char *valbuf, int buflen);
			char* getNextReq(char *fielddate, char *fieldtime, cTime &val, long &index, 
			                int format=CN_FMT, char *empty_date_str="1970-01-01");
			
			//按索引获取GET/POST键对值
			char* getRequest(int index, int &val);
			char* getRequest(int index, double &val);
			char* getRequest(int index, bool &val);
			char* getRequest(int index, cString &val);
			char* getRequest(int index, char **val);
			char* getRequest(int index) ;
			char* getRequest(int dtIndx, int tmIdx, cTime &val, 
			                 int format=CN_FMT, char *empty_date_str="1970-01-01");
	
			//获取POST全部数据
			char* FormContent();	
			
			/***********************
			*数据库操作
			***********************/
			//cp_tranodbc.dll(数据库操作封装组建)
			
			// UPDATE/DELETE 使用executeNoQuery
			int CDefault::SetRouteStop(int pudo_addrid,int stop_id)
			{
				cString sql;
				int ret=1;
				sql &"UPDATE route_stop SET  addr_id="&pudo_addrid&" WHERE stop_id="&stop_id&";";
				
				ckOdbcConn *m_OdbcConn=OdbcConn();
				m_OdbcConn->executeNoQuery(sql.GetBuf());
				if (m_OdbcConn->ErrorNumber()!=0)
				{
					m_errMsg & "错误码=" & m_OdbcConn->ErrorNumber() & "; " & m_OdbcConn->ErrorMessage();
					ret=0;
				}
				return ret;
            }
			
			// SELECT 使用executeQuery
			void CDefaultPage::QueryContact()
			{
				int ss_cont_id = 0;
				int ss_acct_id = 0;
				cString ss_cont_name;
				cString ss_cont_account;
				cString ss_displayContact;
				cString ss_cont_shortname;
				cString ss_acct_tel;

				cString sql;
				sql &"SELECT * FROM tblcontact;";
				
				ckOdbcConn *m_OdbcConn=OdbcConn();
				bool logflag = m_OdbcConn->GetLogFlag();
				m_OdbcConn->SetLog(false);
				ckOdbcRecSet *rs = m_OdbcConn->executeQuery(sql.ToStr());
				m_OdbcConn->SetLog(logflag);
				while (!rs->eof())
				{
					ss_cont_id = rs->field_long("cont_id");
					ss_acct_id = rs->field_long("cont_acctid");
					ss_cont_name = rs->field_str("cont_name");
					ss_cont_account = rs->field_str("cont_account");
					ss_displayContact = rs->field_str("cont_person");
					ss_cont_shortname= rs->field_str("cont_shortname");
					ss_acct_tel = rs->field_str("tel");
					rs->MoveNext();
				}
				rs->Release();
			}
		 



6 常见犯错问题

6.1内存问题(内存不释放)
6.2规范化问题(规范的写法避免理解不够造成坑)
6.3数据库问题



7 lnkHttpSvr服务器部署

7.1 一台机器安装成一个服务
一个进程监听多个端口
7.2 一台机器安装多个服务
多个服务多个进程


8 ini配置与Log日志记录

8.1 Ini配置
ini_httpConfig.ini
ini_tranodbc.ini
ini_httpClient.ini

8.2 Log日志
httpLog
odbclog
_SessionTimeOut.log


9 前端开发与说明

统一界面,建立标准公共的前端开发库(js+css+img等等)
PubSrc前端库的介绍和使用





10 代码管理与版本控制

项目源代码的版本管理工具中,比较常用的主要有:VSS、SVN、Git .
Trunk、Branches、Tags 区别:
Trunk:软件开发过程中的主线,开发时版本存放的目录,即在开发阶段的代码都提交到该目录上,保存了从版本库建立到当前的信息。
Branches:软件开发过程中的分支,发布版本存放的目录,即项目上线时发布的稳定版本存放在该目录中
tags:表示标签存放的目录,tags只可读,不可写
分支主要用于在不影响Trunk其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到Trunk中。