这是我三年前写的,有的地方还不成熟,高手们见笑了!
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/