tcl调用tuxedo实现tpcall

1. 源码

#include <stdio.h>
#include <tcl.h>
#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
#include <string.h>
#include <atmi.h> 
#include <userlog.h>
#include <time.h>
#include <stdarg.h>

extern "C" {
int Tuxedotcl_Init(Tcl_Interp *Interp);
}

/***********************************************************
**  Function Name : write_log
**  DESC: write log by format.
**  FUNC:
**  ARGS: the format like the format of 'printf'.
**  RTN : int
**  NOTE:
**
**  DATE      AUTHOR       ACTION
**  20120524  Wang yaofu   Modify
**
************************************************************/
int write_log( char *format, ... )
{
    time_t timeval;
    struct tm *tmval;
    char   sDate[9];
    char   sTime[9];
    char   logdirf[32], formatBuf[1024], logHead[20];
    va_list mark;
    int fd;

    timeval = time (0);
    tmval = localtime(&timeval);
    sprintf(sDate,"%04d%02d%02d",tmval->tm_year+1900,tmval->tm_mon+1,tmval->tm_mday);
    sprintf(sTime,"%02d:%02d:%02d",tmval->tm_hour,tmval->tm_min,tmval->tm_sec);
    sprintf(logdirf,"AIIFToTuxedo.%s", sDate);
    memset(formatBuf, 0, sizeof(formatBuf));
    sprintf(logHead, "%s [%d]: ", sTime, getpid());
    va_start(mark, format);
    vsnprintf(formatBuf, sizeof(formatBuf), format, mark);
    va_end(mark);
    fd=open(logdirf, O_RDWR|O_APPEND|O_CREAT, 0666);
    if ( fd < 0 ) {
        printf("can open [%s] by pid:[%d]\n", logdirf, getpid());
        return -1;
    }
    write(fd, logHead, strlen(logHead));
    write(fd, formatBuf, strlen(formatBuf));
    write(fd, "\n", 1);
    close(fd);
    return 0;
}

char *tpTrySend( char *aServerName, char *aBuffer )
{
    long int sendlen,ret,rcvlen;
    char *sendbuf;
    char *rcvbuf;
    write_log("tpTrySend::Info:Begin");
    //与服务端创建连接
    if (tpinit((TPINIT *) NULL) == -1) {
        write_log("tpTrySend::Error:Tpinit failed.");
        return 0;
    }

    sendlen = strlen(aBuffer);

    //分配发送缓冲区
    if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
        write_log("tpTrySend::Error:allocating send buffer.");
        tpterm();
        return 0;
    }
    //分配接收缓冲区
    if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
        write_log("tpTrySend::Error:allocating receive buffer.");
        tpfree(sendbuf);
        tpterm();
        return 0;
    }

    strcpy(sendbuf, aBuffer);

    //调用服务端发送请求方法,并接收返回信息,serverName为服务名
    ret = tpcall(aServerName, (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
    write_log("tpTrySend::Info:Recv:[%s]", rcvbuf);

    if(ret == -1) {
        write_log("tpTrySend::Error:Can't send request to service ");
        write_log("tpTrySend::Error:Tperrno = %d", tperrno);
    }
    tpfree(sendbuf);
    tpterm();
    write_log("tpTrySend::Info:End");
    return rcvbuf;
}

int Action_tpCall( int notUsed, Tcl_Interp *interp, int argc, char **argv)
{
    char retBuffer[4096];
    char *retPtr;
    retPtr = NULL;
    if ( argc != 3 )
    {
        Tcl_SetResult(interp, "Usage::Action_tpCall SERVERNAME sendBuffer", TCL_VOLATILE);
        return TCL_ERROR;
    }
    retPtr = tpTrySend( argv[1], argv[2] );
    if ( retPtr == NULL ) {
        Tcl_SetResult(interp, "{20} {发送失败}", TCL_VOLATILE);
        return TCL_ERROR;
    }
    strcpy(retBuffer, "{0} ");
    strcat(retBuffer, retPtr);
    tpfree(retPtr);
    Tcl_SetResult(interp, retBuffer, TCL_VOLATILE);
    return TCL_OK;
}
int Tuxedotcl_Init(Tcl_Interp *Interp) {
    Tcl_CreateCommand (Interp, "Action_tpCall", (Tcl_CmdProc *)Action_tpCall, 0, 0);
    return TCL_OK;
}

2. 编译

 g++ -m32 -fPIC -shared -o libtuxedotcl.so tuxedotcl.cc -I$TUXDIR/include -I$HOME/aitools/platform/include -L$HOME/aitools/lib -ltcl8.2 -L${TUXDIR}/lib -m32 -ltux -lbuft -lfml -lfml32 -lengine -ldl -lpthread

 若需要网络连接连接库文件 -lwsc  -lgpnet

3. 执行

[aiobs8@aiobs8 simpapp]$ 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
%


版权声明:本文为newyf_cun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。