tcl调用tuxedo的一个demo
Tuxedo是Oracle的一个商业中间件,一般用于通信。
如下是一个简单的调用tuxedo的so动态库实现,编译后,tcl脚本可以加载并调用这个so库实现对tuxedo的调用。
1. 代码例子,保存文件为tuxedotcl.cc
#include <stdio.h>
#include <tcl.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <string.h>
#include <atmi.h>
#include <userlog.h>
#include <time.h>
#include <sys/time.h>
#include <stdarg.h> extern "C" {
int Tuxedotcl_Init(Tcl_Interp *Interp);
} void write_log(const char *fmt, ...) {
va_list ap;
int fd;
char msg[4096]; va_start(ap, fmt);
vsnprintf(msg, sizeof(msg), fmt, ap);
va_end(ap); fd = open("tux_tcl.log", O_RDWR|O_APPEND|O_CREAT, 0666);
if ( fd > 0 ) {
write(fd, msg, strlen(msg));
close(fd);
}
} int Action_tpCall(int notUsed, Tcl_Interp *interp, int argc, char **argv)
{
char retBuffer[512];
long int sendlen,rcvlen;
int retCall;
char *sendbuf;
char *rcvbuf; gettimeofday(&beginTime, NULL);
memset(retBuffer, 0, sizeof(retBuffer));
if (argc != 4 && argc != 3) {
Tcl_SetResult(interp, "Usage::Action_tpCall SERVERNAME sendBuffer WSNADDR", TCL_VOLATILE);
return TCL_ERROR;
}
write_log("Action_tpCall:Begin");
if ( argv[3][0] != '\0' ) {
tuxputenv(argv[3]);
} //与服务端创建连接
if ((tpinit((TPINIT *)NULL)) == -1) {
write_log("Action_tpCall::Error:Tpinit failed.");
Tcl_SetResult(interp, "连接初始化失败", TCL_VOLATILE);
return TCL_ERROR;
}
sendlen = strlen(argv[2]); //分配发送缓冲区
if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
write_log("Action_tpCall::Error:allocating send buffer.");
tpterm();
Tcl_SetResult(interp, "发送缓存失败", TCL_VOLATILE);
return TCL_ERROR;
} //分配接收缓冲区
if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
write_log("Action_tpCall::Error:allocating receive buffer.");
tpfree(sendbuf);
tpterm();
Tcl_SetResult(interp, "接收缓存失败", TCL_VOLATILE);
return TCL_ERROR;
} strcpy(sendbuf, argv[2]); //调用服务端发送请求方法,并接收返回信息,serverName为服务名
retCall = tpcall(argv[1],
(char *)sendbuf, sendlen,
(char **)&rcvbuf, &rcvlen, TPNOBLOCK);
if( retCall == -1 ) {
tpfree(sendbuf);
tpfree(rcvbuf);
sprintf(retBuffer, "TUXEDO服务:[%s]", argv[1]);
Tcl_SetResult(interp, retBuffer, TCL_VOLATILE);
return TCL_ERROR;
}
tpfree(sendbuf);
tpterm();
Tcl_SetResult(interp, rcvbuf, TCL_VOLATILE);
tpfree(rcvbuf);
return TCL_OK;
} int Tuxedotcl_Init(Tcl_Interp *Interp) {
Tcl_CreateCommand (Interp, "Action_tpCall", (Tcl_CmdProc *)Action_tpCall, 0, 0);
return TCL_OK;
}
2. 编译
如果tuxedo安装在本地机器上时,可以简单的进行如下编译。
g++ -fPIC -shared -o libtuxedotcl.so tuxedotcl.cc -I$TUXDIR/include -ltcl -L${TUXDIR}/lib -ltux -lbuft -lfml -lfml32 -lengine -ldl -lpthread
如果tuxedo安装在远端机器上时,编译时需要链接网络相关的库文件 -lwsc -lgpnet
g++ -fPIC -shared -o libtuxedotcl.so tuxedotcl.cc -I$TUXDIR/include -ltcl -L${TUXDIR}/lib -lwsc -lbuft -lgpnet -lfml -lfml32 -lengine -ldl -lpthread
3. 执行
$ tclsh
% load libtuxedotcl.so
% Action_tpCall TOUPPER wangyfTestdddd
{0} WANGYFTESTDDDD
% Action_tpCall TOUPPER {This is a toupper test action}
{0} THIS IS A TOUPPER TEST ACTION
%
tcl调用tuxedo的一个demo的更多相关文章
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
		
在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...
 - 在VS中实现webService的一个demo(图解)
		
在VS中实现webService的一个demo(图解) 先创建一个web项目,创建好web项目后,添加新建项——web服务 在新建好的web服务文件中写如下代码: 生成当前解决方案. 新建一个winf ...
 - 一个demo学会js
		
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
 - [置顶]
        一个demo学会c#
		
学习了c#4.5高级编程这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的c#编程知识.让你一个demo掌握c#编程,如果有问题可以留言. 此demo主要包括五个文件:Stude ...
 - Android 通知栏Notification的整合 全面学习 (一个DEMO让你全然了解它)
		
在android的应用层中,涉及到非常多应用框架.比如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架.通知机制,ActionBar框架等等. ...
 - Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》
		
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...
 - .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯
		
最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...
 - 【转】 [置顶] Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
		
在Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...
 - (1)shiro简介和第一个demo
		
之前一直在用shiro开发,不过只是会使用,并没有深入了解,最近有时间学习了一下,把最近学习所得分享一下. shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授 ...
 
随机推荐
- 05.K米评测
			
体验产品:K米Android版本 软件版本:4.3.0 设备型号:魅蓝note2 操作系统: Android5.1 体验时间:2016.10.15-2016.10.15 体验人:黄瑞钰(0314025 ...
 - K米APP----案例分析
			
K米APP----案例分析 第一部分 调研,评测 第一次上手体验 软件的美工做得不错,功能排版很清楚,用户很容易上手,不至于用户不知道怎么用这个APP点歌 软件最主要的功能是KTV的点歌功能,这个功能 ...
 - SQL Server的数据库连接的极限在哪儿?
			
在软件设计中,关于多层的设计,有一部份是有关数据库的. 设计上分成这样三层 客户端UI -- 应用服务器 -- 数据库服务器 有个说法是,可以在应用服务器这一层共享使用数据库连接池,从而减轻数据库服务 ...
 - 【突发问题】昨天更新了OS X EI Capitan  出现了Cocoapods的 pod :command not found
			
然后我百度:http://www.jianshu.com/p/6ff1903c3f11 果真,我想想然后执行了作者说的第一步,删除本地Cocoapods文件,然后发现我执行不了接下来的几个步骤了.所以 ...
 - mac OS(OS X)的OI编译环境配置指南
			
编译环境:gdb+Atom 如何安装gdb: http://logic0.blog.163.com/blog/static/1889281462014183271283/ Atom下载地址: ht ...
 - 优化DP的奇淫技巧
			
DP是搞OI不可不学的算法.一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉. 故下面记录一些优化DP的奇淫技巧. OJ 1326 裸的状态方程很好推. f[i]=max(f[j]+sum ...
 - Docker探索系列2之镜像打包与DockerFile
			
preface docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建 ...
 - StringBuilder  和  StringBuffer
			
这两者唯一的不同就在于,StringBuffer是线程安全的,而StringBuilder不是.当然线程安全是有成本的,影响性能,而字符串对象及操作,大部分情况下,没有线程安全的问题,适合使用Stri ...
 - wpf的毛边窗体效果 前台代码
			
<Window x:Class="wpfwindowsmove.毛边窗体" xmlns="http://schemas.microsoft.com/w ...
 - Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持
			
前面有关于lnmp环境的搭建,在此就不在赘述.下面就简述thinkPHP如何在nginx下开启url_rewrite和pathinfo模式支持 主要有两个步骤: 一.更改php.ini将;cgi.fi ...