免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7661 | 回复: 37
打印 上一主题 下一主题

[SCO UNIX] 中间业务 server 端通讯源程序 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2002-12-16 09:14 |只看该作者 |倒序浏览
这是我三年前写的,有的地方还不成熟,高手们见笑了!

main.c
==========================
#include <stdio.h>;
#include <signal.h>;
#include <time.h>;
#include <fcntl.h>;
#include <setjmp.h>;
#include <signal.h>;
#include <unistd.h>;
#include "sockcomm.h"
#define  TimeOut 30

static int  iSockID1;
static int  iSockID;
static int  iSock;
typedef  void sigfunc( int );
jmp_buf tohere2;

int  CloseSock();


main()
{
int  iRet,p,p1,len,pid;
int  iPort,jPort,packlen;
int iSndLen,iRcvLen,retcode;
long mtype;
char type[7];
char szBuf[1028];
char rzBuf[1028];
char szHost[20],szSnd[1028],szRcv[1028];
char requ[1025],resp[1028];
char msgbuf[1028];
char head;
sigfunc *sig1;  
Record *rec;
  
MsgId = msg_init();
mtype = 6L;

iPort = 8300;
iSockID = sockServerOpen( iPort );
if( iSockID < 0 )
{
printf("SockServerOpen FAIL! ret_code = %d\n",iSockID);
exit(0);
}
signal(SIGCLD,SIGIGN);
signal(SIGINT,CloseSock);

while(1)
{
memset( szBuf,0,102;
iSock = sockListen( iSockID );
if( iSock < 0 ) break;
iRet = sockRecvBuf( iSock, szBuf, 4 ,TimeOut );
if(iRet<=0)
{
printf("\n\n接收网点socket失败!\n";
close(iSock);
continue;
}
len=atoi(szBuf);
iRet = sockRecvBuf( iSock, szBuf, len ,TimeOut );
if(iRet<=0)
{
printf("\n\n接收网点socket失败!\n";
close(iSock);
continue;
}

printf("\n\n接收网点socket:[%s]\n",szBuf);

if((pid=fork())<0 )
{
printf("Fork Error!";
close(iSock);
continue;
}
else if( pid>;0 )
{
strcpy( szHost,"192.168.0.1" );
jPort = 5555;
memset( szRcv,0,sizeof(szRcv) );
iSockID1=sockClientOpen( szHost, jPort);
/*****  Begin to Send  *****/
packlen = htons(strlen(szBuf));
iRet=sockSendBuf( iSockID1, (char *)&packlen,2,TimeOut);
if(iRet<0)
{
printf("发送socket ERROR 1!\n";
close(iSockID1);
close(iSock);
exit (-1);
}
len = strlen(szBuf);
iRet=sockSendBuf( iSockID1, szBuf,len,TimeOut);
if(iRet<0)
{
printf("发送socket ERROR 2!\n";
close(iSockID1);
close(iSock);
exit (-1);
}
/*****  End of Send  *****/

/*****  Begin to Recv Return Code  *****/
iRet=sockRecvBuf( iSockID1,(char *)&len,2 ,TimeOut);
if(iRet<0)
{
printf("接收socket ERROR 1!\n";
close(iSockID1);
close(iSock);
exit (-1);
}
len=ntohs(len);
memset(szRcv,0,sizeof(szRcv));
iRet=sockRecvBuf( iSockID1, szRcv,len,TimeOut);
if(iRet<0)
{
printf("接收socket ERROR 2!\n";
close(iSockID1);
close(iSock);
exit (-1);
}
printf("接收socket:[%s]\n",szRcv);
/*****  End of Recv Return Code *****/


memset(szBuf,'\0',102;
sprintf(szBuf,"%04d",len);
iRet=sockSendBuf(iSock,szBuf,4,TimeOut);
if(iRet<0)
{
printf("发送socket至网点失败1!\n";
close(iSockID1);
close(iSock);
exit(-1);
}
iRet=sockSendBuf(iSock,szRcv,len,TimeOut);
if(iRet<0)
{
printf("发送socket至网点失败2!\n";
close(iSockID1);
close(iSock);
exit (-1);
}
printf("发送socket至网点成功!\n";
}
close(iSock);
}
}


int CloseSock()
{
close(iSock);
close(iSockID);
close(iSockID1);
return 0;
}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2002-12-16 09:17 |只看该作者

中间业务 server 端通讯源程序

comm.c   通讯函数
=============================

#include <math.h>;
#include <stdio.h>;
#include <sys/tape.h>;
#include <time.h>;
#include <string.h>;
#include <stdlib.h>;
#include <errno.h>;
#include <fcntl.h>;
#include <setjmp.h>;
#include <signal.h>;
#include <unistd.h>;
#include <netdb.h>;
#include <netinet/in.h>;
#include <sys/types.h>;
#include <sys/socket.h>;

typedef  void sigfunc( int )&#59;
jmp_buf tohere1&#59;
void  alrm1(int a)
{
   alarm(0)&#59;
   longjmp( tohere1, 1 )&#59;
}

int sockServerOpen( int sinPort )
{
   int sHandle&#59;
   int iLen&#59;
   struct sockaddr_in server&#59;

   if( ( sHandle = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
      return sockOpenFail&#59;
   server.sin_family = AF_INET&#59;
   server.sin_addr.s_addr = ntohl(INADDR_ANY)&#59;
   server.sin_port = ntohs(sinPort)&#59;

   if( bind( sHandle, ( struct sockaddr * )&amp;server, sizeof(server) ) < 0 )
      return sockBindFail&#59;
   iLen = sizeof( server )&#59;
   if( getsockname( sHandle,( struct sockaddr * )&amp;server, &amp;iLen ) < 0 )
   {
      return sockGetSockName&#59;
   }
   listen(sHandle,5)&#59;
   return (sHandle)&#59;
}


int sockClientOpen( char *pszHost, int sinPort ,int timeout)
{
   int sHandle&#59;
   sigfunc *sig&#59;  
   struct sockaddr_in server&#59;
   struct hostent *hp,*gethostbyname()&#59;
   if( setjmp( tohere1 ) )  
   {
   signal( SIGALRM, sig)&#59;
return ( sockOpenFail )&#59;
   }
   sig=signal( SIGALRM, alrm1)&#59;
   alarm( timeout )&#59;

   if( ( sHandle = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
      return sockOpenFail&#59;

   server.sin_family=AF_INET&#59;
/*
   if( ( hp = gethostbyname( pszHost ) ) == NULL )
   {
      if( ( hp = gethostbyaddr(pszHost,strlen(pszHost),SOCK_STREAM) ) == NULL )
      {
   alarm( 0 )&#59;
   signal( SIGALRM, sig)&#59;
        return sockUnknowHost&#59;
      }
   }
   memcpy( (char *)&amp;server.sin_addr, (char *)hp->;h_addr, hp->;h_length )&#59;
*/
   server.sin_addr.s_addr=inet_addr(pszHost)&#59;
   server.sin_port = htons(sinPort)&#59;

   if( connect( sHandle, (struct sockaddr *)&amp;server, sizeof(server) ) < 0 )
   {
      alarm( 0 )&#59;
      signal( SIGALRM, sig)&#59;
      return sockConnectFail&#59;
   }
   alarm( 0 )&#59;
   signal( SIGALRM, sig)&#59;
   return( sHandle )&#59;
}


int sockClose( int sHandle )
{
   close( sHandle )&#59;
   return( 0 )&#59;
}


int sockSendBuf( int sHandle, void *pszBuf, int iLen ,int iTimeOut)
{
   int iRet=0&#59;
   sigfunc *sig&#59;  
   int i=0&#59;
   if( setjmp( tohere1 ) )  
   {
  signal( SIGALRM, sig)&#59;
return ( sockRecvTimeOut )&#59;
   }
   sig=signal( SIGALRM, alrm1)&#59;
   alarm( iTimeOut )&#59;
   while(iRet<iLen)
   {
     if((i=send(sHandle, pszBuf, iLen-iRet, 0))<0)
     {  
  alarm(0)&#59;
    signal(SIGALRM,sig)&#59;
          return(i)&#59;  
     }
     iRet=iRet+i&#59;
     pszBuf=(char *) pszBuf+i&#59;
   }
   alarm( 0 )&#59;
   signal( SIGALRM, sig)&#59;
   if( iRet < 0 )  return( sockSendFail )&#59;
   return( iRet )&#59;
}


int sockRecvBuf( int sHandle, void *pszBuf, int iMaxLen,int iTimeOut )
{
   int iLen=0,i=0&#59;
   sigfunc *sig&#59;  

   if( setjmp( tohere1 ) )  
   {
  signal( SIGALRM, sig)&#59;
        return ( sockRecvTimeOut )&#59;
   }
   sig=signal( SIGALRM, alrm1)&#59;
   alarm( iTimeOut )&#59;
   while(iLen<iMaxLen)
   {
i = recv( sHandle, pszBuf, iMaxLen-iLen,0)&#59;
if (iLen < 0 )
{
alarm( 0 )&#59;
signal( SIGALRM, sig)&#59;
return (i)&#59;
}
iLen+=i&#59;
pszBuf=(char *)pszBuf+i&#59;
   }
   alarm( 0 )&#59;
   signal( SIGALRM, sig)&#59;
   return( iLen )&#59;
}


int sockListen( int sHandle )
{
   int iSock&#59;
   do
   {
iSock = accept( sHandle, ( struct sockaddr * )NULL, ( int * )NULL )&#59;
   } while(iSock==-1&amp;&amp;EINTR==errno)&#59;
   return(iSock)&#59;
}



论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2002-12-16 09:20 |只看该作者

中间业务 server 端通讯源程序

农行的高手!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2002-12-16 09:21 |只看该作者

中间业务 server 端通讯源程序

请大家批评指正!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2002-12-16 09:56 |只看该作者

中间业务 server 端通讯源程序

没有顶的吗? 以后不发了!

论坛徽章:
0
6 [报告]
发表于 2002-12-16 10:37 |只看该作者

中间业务 server 端通讯源程序

[这个贴子最后由f7zz在 2002/12/16 10:38am 编辑]

我顶     

论坛徽章:
0
7 [报告]
发表于 2002-12-16 10:40 |只看该作者

中间业务 server 端通讯源程序

[这个贴子最后由shaojun在 2002/12/16 10:40am 编辑]

hi_sj@sina.com
太谢谢你了!
有其他资料吗?能发给我吗?我是个刚入门的。以前一直用DELPHI,VB这些玩具做开发。刚开始做UNIX。

论坛徽章:
0
8 [报告]
发表于 2002-12-16 10:46 |只看该作者

中间业务 server 端通讯源程序

太棒了!!!

论坛徽章:
0
9 [报告]
发表于 2002-12-16 12:06 |只看该作者

中间业务 server 端通讯源程序

很好很好

论坛徽章:
0
10 [报告]
发表于 2002-12-16 12:07 |只看该作者

中间业务 server 端通讯源程序

需要的朋友赶快来顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP