| 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 编辑] [email protected] 太谢谢你了! 有其他资料吗?能发给我吗?我是个刚入门的。以前一直用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:[email protected] |
| 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 |
| 一般般 |