• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

中间业务 server 端通讯源程序

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 21次 | 进入软件测试论坛讨论

领测软件测试网
这是我三年前写的,有的地方还不成熟,高手们见笑了!

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,1028);
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',1028);
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;
}

【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】
 htldm 回复于:2002-12-16 09:17:40
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 ); 
jmp_buf tohere1; 
void  alrm1(int a)
{
   alarm(0);
   longjmp( tohere1, 1 );
}

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

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

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


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

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

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

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


int sockClose( int sHandle )
{
   close( sHandle );
   return( 0 );
}


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


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

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


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



 lljj 回复于:2002-12-16 09:20:35
农行的高手!

 htldm 回复于:2002-12-16 09:21:51
请大家批评指正!

 htldm 回复于:2002-12-16 09:56:55
没有顶的吗? 以后不发了!

 f7zz 回复于:2002-12-16 10:37:45
[这个贴子最后由f7zz在 2002/12/16 10:38am 编辑]

我顶 :em27:  :em27:  :em27: 

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

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


 天明700 回复于:2002-12-16 10:46:14
太棒了!!!

 spirit 回复于:2002-12-16 12:06:34
很好很好

 spirit 回复于:2002-12-16 12:07:27
需要的朋友赶快来顶一下

 flybirdxp 回复于:2002-12-16 12:08:38
支持一下,希望能看到跟好的东西!!!

 sd-feng 回复于:2002-12-16 13:04:49
ok

 大梦 回复于:2002-12-16 13:09:45
顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!顶!

 大梦 回复于:2002-12-16 13:19:26
再贴个数据库的来看看!

 大梦 回复于:2002-12-16 13:26:33
$ cc -c comm.c
"comm.c", line 32: error: undefined symbol: sockOpenFail
"comm.c", line 38: error: undefined symbol: sockBindFail
"comm.c", line 42: error: undefined symbol: sockGetSockName
"comm.c", line 58: error: undefined symbol: sockOpenFail
"comm.c", line 64: error: undefined symbol: sockOpenFail
"comm.c", line 86: error: undefined symbol: sockConnectFail
"comm.c", line 109: error: undefined symbol: sockRecvTimeOut
"comm.c", line 126: error: undefined symbol: sockSendFail
"comm.c", line 139: error: undefined symbol: sockRecvTimeOut
$ cc -c main.c
"main.c", line 8: error: cannot find include file: <sockcomm.h>
"main.c", line 34: error: undefined symbol: Record
"main.c", line 34: error: undefined symbol: rec
"main.c", line 36: error: undefined symbol: MsgId
"main.c", line 46: error: undefined symbol: SIGIGN
"main.c", line 46: warning: improper pointer/integer combination: arg #2
"main.c", line 47: warning: argument is incompatible with prototype: arg #2
$
应该怎么编译呀???

 flybirdxp 回复于:2002-12-16 13:53:27
把头文件也贴出来吧

 geekchi 回复于:2002-12-16 13:58:36
ok

 edit 回复于:2002-12-16 15:22:03


 htldm 回复于:2002-12-16 16:03:17
main.c 只是server端通信机制演示,不能直接编译使用的!!!
comm.c 是完整的TCP/IP通信函数,可直接程序调用!

 rengongpu 回复于:2002-12-16 16:07:53
感谢农行的朋友。

 hzhrh 回复于:2002-12-16 16:46:59
不是很好,应当在启动侦听等待连接之后,如果有连接到达,将接收和发送都放到子进程中去。这样的好处我想你也应该知道吧。

 balcony 回复于:2002-12-16 20:03:30
给了这些简单的代码,然后就有一批人再那里---顶----, 水平是不是太低了一点阿,
呵呵, 
最好给出一下系统设计方面的文章, 或许,,,,,,,


 大梦 回复于:2002-12-16 20:07:04
楼上的GG,怎么能这么说呢,你也贴几个出来我们顶顶!

 lcz88990200 回复于:2002-12-16 20:15:49
c写得很好,主控没考虑并发机制

 1048576 回复于:2002-12-16 21:20:14
[这个贴子最后由1048576在 2002/12/16 09:21pm 编辑]

[quote][b]下面引用由[u]balcony[/u]在 [i]2002/12/16 08:03pm[/i] 发表的内容:[/b]
给了这些简单的代码,然后就有一批人再那里---顶----, 水平是不是太低了一点阿,
呵呵, 
最好给出一下系统设计方面的文章, 或许,,,,,,,
[/quote]

论坛中总有一些人不尊重别人的劳动成果,总觉得自已不错,对别人共享的东西嗤之以鼻,一棒子打下去,如果你们真有本事也拿点东西出来,别干打雷不下雨,记得有一种鸟叫怪口,天生声音沙哑,但就是看不惯别的鸟的啼鸣,如果将其和百灵等鸟放到一起,百灵等刚发出悦耳的它就呱呱刺耳的叫,吓得别的鸟不敢啼鸣,久而久之别人鸟就变成的哑鸟,现在这个论坛中有一些人就是这样,别人拿出来的他就开口呱呱叫,让人心寒,如果再这样下去,大家就会学不到什么,何谈什么进步。别让几条鱼腥了一锅汤。
当然如果你真是高手,你有不同意见心平气和的提出来,让发贴者和看贴者都能学到东西这是最好,互相学习嘛,别共享者让人寒心呀!!!!!!

农行的朋友,我们支持你!


 云中飘 回复于:2002-12-16 22:12:23
看也来看不懂啊

 天明700 回复于:2002-12-17 08:31:17
哥哥你大胆往前走,
别理会,
怪鸟怪口怪鸣叫。


 chinawhd 回复于:2002-12-17 08:38:53
看你的编译错误提示,应该是头文件不存在,

up

 netop5 回复于:2002-12-17 09:01:17
好帖,我收藏了

 9997 回复于:2003-01-27 08:52:09
我顶我顶我顶顶顶,
我也在金融做系统,刚开始学习编程,希望能得到你的帮助。
能发给我你的一些资料吗?
我的E:js_nt@hotmail.com




 9997 回复于:2003-01-27 08:57:18
cc   -o -lsocket


 mryzy 回复于:2003-04-14 14:27:34
把main.c中的#include "sockcomm.h"改成#include "comm.c"
编译 cc -o main main.c -lsocket.a

好象有些库未提供socket.a库文件?

 蓝色键盘 回复于:2003-04-14 18:00:44
这段代码受到如此多人的拥护,我没有批评的任何意思,但是对于程序中的不足,我想还是应该说说,免得有人在使用的过程中疑惑。也请搂主就下面的问题谈论一下。
1、main中,接受完主动连接方的报文长度和报文后,作fork()调用,这个调用似乎毫无意义,因为所有的操作仍然由父进程完成。不知道在此fork的真正用意是什么?

2、main中,while循环做了一个socket连接到某一端点并且接收数据,然后把接受数据响应给while循环前的那么socket连接请求,倘若这两个连接中的某个出现异常将会带来很多问题,甚至是灾难性的。请搂主做个解决的方法?

3、报文处理限制在1028bytes。实际的银行业务中,报文往往会大于该值,对此如何处理??

4、如下的封装API如何解释?
int sockListen( int sHandle )
{
    int iSock;
    do
    {
        iSock = accept( sHandle, ( struct sockaddr * )NULL, ( int * )NULL );
    } while(iSock==-1&&EINTR==errno);

    return(iSock);
}

5、程序只能提供迭代服务,该段代码对于并发量较大时如何处理?

6、其他的一些小的问题,例如API与调用者之间参数不匹配,信号处理以及连接方式等等再次不做讨论了。

 richarder 回复于:2003-04-14 22:51:58
行家一出手,便知有没有。

 tiemuzheng 回复于:2003-04-15 16:03:11
我也顶一下!

 lwj2003429 回复于:2003-04-16 17:46:41
还是要顶一下,大家不鼓励怎么会有好作品呢??

 蓝色键盘 回复于:2003-04-16 18:14:15
是的,不论怎么说,也要感谢楼主,这个代码我拿到C/C++作个讨论,如何?
:)

 hseng 回复于:2004-01-04 11:13:21
一般般

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网