Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182161
  • 博文数量: 88
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 914
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-10 13:41
文章分类

全部博文(88)

文章存档

2010年(2)

2009年(35)

2008年(51)

我的朋友

分类:

2008-06-06 19:42:45

参考了一些tuxedo资料写一个服务样例程序,代码如下:    
文件:TuxedoAPP.rar
大小:3KB
下载:下载
服务端程序:
#include
#include
#include
#include
#include /* TUXEDO */

#define SRECV 1
#define SSEND 2
#define SDONE 3

#define BUF_SIZE 512

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
AUDITC(TPSVCINFO *rqst)
#else
AUDITC(rqst)
TPSVCINFO *rqst;
#endif
{
   long state = SRECV;
   long lEvent;
   long lLen = 0 ;
   char* sBuf = NULL;
   char retBuf[BUF_SIZE+1]={0};
   int iOff = 0 ;


   /*Alloc a buffer*/
   //char * tpalloc(char *type, char *subtype, long size)
   if(  (sBuf=(char*)tpalloc("STRING",NULL,BUF_SIZE+1)) == NULL )
       {
      (void)userlog("Server alloc buffer failed");
      sprintf(sBuf,"%s","Server alloc buffer failed");
      //void tpreturn(int rval, long rcode, char *data, long len, long flags)
      tpreturn(TPFAIL,0,sBuf,strlen(sBuf),0);
    }
   for(;;)
       {
       switch(state)
           {
           case SRECV :
                   {
                    userlog("came in SRECV!");   
                    //int tprecv(int cd, char **data, long *len, long flags, long  *revent)
                    if( tprecv(rqst->cd,&sBuf,&lLen,0,&lEvent) == -1 )
                    {
                       if((tperrno == TPEEVENT) && (lEvent == TPEV_SENDONLY))
                           {
                             userlog("Server state change from recv to send!");
                          state = SSEND;
                        }
                       else
                           {
                          userlog("Server receive failed!");
                          sprintf(sBuf,"%s","Server receive failed!");
                          tpreturn(TPFAIL,0,sBuf,strlen(sBuf),0);
                        }
                    }
                    userlog("Receive buf is: %s",sBuf);
                    strcpy(retBuf+iOff,sBuf);
                    iOff += (int)strlen(sBuf);
                    userlog("len:%d\n",iOff);
                    userlog("After append buf is: %s",retBuf);
                 }
               break;
           case SSEND :
                   {
                    //int tpsend(int cd, char *data, long len, long flags, long *revent)
                    userlog("sBuf len:%d\n",strlen(sBuf));
                    if(strlen(sBuf) >0)
                    {
                      userlog("sBuf:%s cleared\n",sBuf);
                      memset(sBuf,0,strlen(sBuf));
                     }
                    userlog("send len:%d\n",strlen(retBuf));
                    strcpy(sBuf,(const char*)retBuf);
                    if(tpsend(rqst->cd,sBuf,strlen(sBuf),0,&lEvent) == -1 )
                    {
                        userlog("Server tpsend(%d) appended buffer failed,%s",lEvent,tpstrerror(tperrno));
                    }
                    else
                    {  
                        userlog("Server send appended buffer success");                       
                    }
                    /* Ater sending appended buffer,exit.*/
                    state = SDONE;
                }
               break;
           case SDONE :
                   {
                    //void tpfree(char *ptr)
                    userlog("came in SDONE!");   
                    if(sBuf != NULL)
                    {
                        tpfree(sBuf);
                    }
                   
                    tpreturn(TPSUCCESS,0,rqst->data,0,0);

                    state = SRECV;
                    userlog("Server deal with business done!");       
                 }
               break;
           default:
                 userlog("Switch case default!");   
               break;     
        } 
    }
  
}


客户端程序:
#include
#include
#include
#include
#include /* TUXEDO */

#define SRECV 1
#define SSEND 2
#define SDONE 3

#define BUF_SIZE 512

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
AUDITC(TPSVCINFO *rqst)
#else
AUDITC(rqst)
TPSVCINFO *rqst;
#endif
{
   long state = SRECV;
   long lEvent;
   long lLen = 0 ;
   char* sBuf = NULL;
   char retBuf[BUF_SIZE+1]={0};
   int iOff = 0 ;


   /*Alloc a buffer*/
   //char * tpalloc(char *type, char *subtype, long size)
   if(  (sBuf=(char*)tpalloc("STRING",NULL,BUF_SIZE+1)) == NULL )
       {
      (void)userlog("Server alloc buffer failed");
      sprintf(sBuf,"%s","Server alloc buffer failed");
      //void tpreturn(int rval, long rcode, char *data, long len, long flags)
      tpreturn(TPFAIL,0,sBuf,strlen(sBuf),0);
    }
   for(;;)
       {
       switch(state)
           {
           case SRECV :
                   {
                    userlog("came in SRECV!");   
                    //int tprecv(int cd, char **data, long *len, long flags, long  *revent)
                    if( tprecv(rqst->cd,&sBuf,&lLen,0,&lEvent) == -1 )
                    {
                       if((tperrno == TPEEVENT) && (lEvent == TPEV_SENDONLY))
                           {
                             userlog("Server state change from recv to send!");
                          state = SSEND;
                        }
                       else
                           {
                          userlog("Server receive failed!");
                          sprintf(sBuf,"%s","Server receive failed!");
                          tpreturn(TPFAIL,0,sBuf,strlen(sBuf),0);
                        }
                    }
                    userlog("Receive buf is: %s",sBuf);
                    strcpy(retBuf+iOff,sBuf);
                    iOff += (int)strlen(sBuf);
                    userlog("len:%d\n",iOff);
                    userlog("After append buf is: %s",retBuf);
                 }
               break;
           case SSEND :
                   {
                    //int tpsend(int cd, char *data, long len, long flags, long *revent)
                    userlog("sBuf len:%d\n",strlen(sBuf));
                    if(strlen(sBuf) >0)
                    {
                      userlog("sBuf:%s cleared\n",sBuf);
                      memset(sBuf,0,strlen(sBuf));
                     }
                    userlog("send len:%d\n",strlen(retBuf));
                    strcpy(sBuf,(const char*)retBuf);
                    if(tpsend(rqst->cd,sBuf,strlen(sBuf),0,&lEvent) == -1 )
                    {
                        userlog("Server tpsend(%d) appended buffer failed,%s",lEvent,tpstrerror(tperrno));
                    }
                    else
                    {  
                        userlog("Server send appended buffer success");                       
                    }
                    /* Ater sending appended buffer,exit.*/
                    state = SDONE;
                }
               break;
           case SDONE :
                   {
                    //void tpfree(char *ptr)
                    userlog("came in SDONE!");   
                    if(sBuf != NULL)
                    {
                        tpfree(sBuf);
                    }
                   
                    tpreturn(TPSUCCESS,0,"",0,0);

                    state = SRECV;
                    userlog("Server deal with business done!");       
                 }
               break;
           default:
                 userlog("Switch case default!");   
               break;     
        } 
    }
  
}

阅读(1846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~