📄 com_lzser.cpp
字号:
//------------------------------------------------------------------- //文件名:ComSocket_lzSer.cpp//创建人:陈熹//日 期:2002-10-21//修改人://日 期://描 述:通讯模块(来帐发送的服务端模式)//版 本://Copyright (c) 2002 EITOP//------------------------------------------------------------------- #include "Com_lzser.h"//------------------------------------------------------------------- //函数名: ComSocket_lzSer//功能描述: 构造函数//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- ComSocket_lzSer::ComSocket_lzSer(void){ char tmpbuf[1+1]; socket_id = -1; msocket_id = -1; connfd = -1; memset( PORT, 0x0, sizeof(PORT)); memset( tmpbuf, 0x0, sizeof(tmpbuf)); memset( Mac_IP, 0x0, sizeof(Mac_IP)); ComFunction::GetConcreteClassOnePameterValue("ComSocket_lzSer", "port", PORT); ComFunction::GetConcreteClassOnePameterValue("ComSocket_lzSer", "machine", Mac_IP); ComFunction::GetConcreteClassOnePameterValue("ComSocket_lzSer", "logleval", tmpbuf); err_log = atoi(tmpbuf);}//------------------------------------------------------------------- //函数名: ~ComSocket_lzSer//功能描述: 析构函数//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- ComSocket_lzSer::~ComSocket_lzSer(){}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Open()//功能描述: 打开通讯端口//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Open(){ printf("开始打开服务端口[%s]\n", PORT); socket_id = Server_Sock( PORT , "tcp" , MAXLIST ); if(socket_id < 1 ) { printf("创建SOCKET 套接口失败\n"); return -1; } printf("设置SOCKET 套接口的属性\n"); if( Set_Sock_Att(socket_id) <= -1 ) { printf("设置SOCKET 套接口的属性失败\n"); return -1; } return 0;}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Service()//功能描述: 开始服务//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Service(){ int nsel,maxfd; size_t clilen; fd_set rset,mset; char ipaddress[20]; struct sockaddr_in Sin; FD_ZERO(&mset); FD_SET(socket_id, &mset); maxfd = socket_id; rset = mset; memset( ipaddress, 0x0, sizeof(ipaddress)); if( msocket_id==-1 ) { printf("Begin accept..............\n"); nsel = select(maxfd+1, &rset, NULL, NULL, NULL); if ( FD_ISSET(socket_id, &rset) && nsel>=0 ) { clilen = SockAddrLength; if( (connfd = accept(socket_id, (struct sockaddr *)&Sin, &clilen)) <0 ) { if ((errno == EWOULDBLOCK) || (errno ==ECONNABORTED) || (errno == EPROTO) || (errno == ENOSR) || (errno == EINTR) ) { sleep(3); return 9; } else { printf("accept error=[%d]\n",errno); return -1; } } msocket_id = connfd; sprintf( ipaddress, inet_ntoa(Sin.sin_addr)); printf("ipaddress=[%s]\n",ipaddress); if( err_log==7 ) LogPro(__FILE__,__LINE__,1,"ipaddress=[%s]\n",ipaddress); if ( strcmp( ipaddress, Mac_IP)) { printf("接收的IP地址是非法配置地址或者是合法主机的二次连接\n"); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"接收的IP地址是非法配置地址或者是合法主机的二次连接\n"); return 0; } printf("==========in accept fun=============\n"); printf("ipaddress=[%s]\n",ipaddress); printf("Mac_IP=[%s]\n",Mac_IP); printf("==========in accept fun=============\n"); } } else { return -1; } return 0;}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Recv(char** RecvBuffer, int* RecvBufferLen, int* RetCode, char** RetMsg)//功能描述: 接收数据函数//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Recv(char* RecvBuffer, int* RecvBufferLen, int* RetCode, char* RetMsg){ long i_bufflen; char buff[COMMAXBUFF]; char lenbuff[10]; char transhead[HEADLEN+1]; memset(buff, 0x0, sizeof(buff)); memset(transhead, 0x0, sizeof(transhead)); memset(lenbuff, 0x0, sizeof(lenbuff)); if( Read_Sock(connfd,(char *)lenbuff,6,SOCK_TIMEOUT) != 6 ) { *RetCode = 105; sprintf(RetMsg, "Recv error(Read head error)"); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"Recv error(Read head error)\n"); close(connfd); msocket_id = -1; return (-1); } i_bufflen = atol((const char *)lenbuff); if( Read_Sock( connfd,(char *)buff,i_bufflen,SOCK_TIMEOUT ) != i_bufflen ) { *RetCode=104; sprintf(RetMsg,"Send error(Client read data error)"); printf("read buff error\n"); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"Send error(Client read data error)\n"); close(connfd); msocket_id = -1; return -1; } *RecvBufferLen = i_bufflen;//-HEADLEN; //memcpy( transhead,(char *)buff,HEADLEN ); //取出头信息 memcpy( RecvBuffer,(char *)buff,/*+HEADLEN,*/*RecvBufferLen ); //取出buff信息 printf("RecvBuffer=[%s]\n",*RecvBuffer); *RetCode = atoi(RecvBuffer); sprintf(RetMsg,"Call Recv Success"); int Res = Write_Sock( connfd , "000006000000", 12); if( Res != 12 ) { printf("send confirm error\n"); *RetCode=104; sprintf(RetMsg,"Send error write data error)"); close(connfd); msocket_id = -1; return -1; } return 0;}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Send(char* SendBuffer, int Sendbufferlen, int* RetCode, char** RetMsg)//功能描述: 发送数据函数//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Send(char* SendBuffer, int fileflag ,int Sendbufferlen, int* RetCode, char* RetMsg){ int Res,macbz; char filepath[50]; char fn[FILEPATHLEN],pt[FILEPATHLEN]; struct stat st; long c_bufflen; long lLen; char c_buff[COMMAXBUFF]; char lenbuff[10]; char tmp_buf[5]; char tmp_transhead[HEADLEN+1]; char ipaddress[20]; char cmtno[3+1]; char filecon[4+1]; TRANSHEAD transhead; memset( ipaddress, 0, sizeof(ipaddress)); memset( filepath, 0, sizeof(filepath)); memset( cmtno, 0, sizeof(cmtno)); memset( fn , 0 , sizeof(fn) ); memset( pt , 0 , sizeof(pt) ); memset( c_buff , 0 , sizeof(c_buff) ); memset( filecon , 0 , sizeof(filecon) ); memset( tmp_buf , 0 , sizeof(tmp_buf) ); memset( lenbuff , 0 , sizeof(lenbuff) ); memset( tmp_transhead , 0 , sizeof(tmp_transhead) ); //构造传送报文信息 memset( (char *) &transhead , 0 , HEADLEN ); memset( (char *) &transhead , ' ' , HEADLEN-1 ); transhead.Command_Type = '1'; fileflag = 0; /* memcpy( cmtno, SendBuffer, 3 ); if ( strncmp( cmtno, "689", 3)==0 ) { fileflag = 1; sprintf( filepath, "%s/file/detail.dat", getenv("WORKDIR")); } else if ( strncmp( cmtno, "417", 3)==0 ) { fileflag = 1; sprintf( filepath, "%s/file/bankno.dat", getenv("WORKDIR")); } if( fileflag == 1 ) { memset( &st , 0 , sizeof(struct stat) ); stat( filepath , &st ); SepPathName( filepath , pt , fn ); transhead.TransFile = '1'; sprintf(transhead.FileLength,"%10d",st.st_size); sprintf( transhead.FileName,"%-100s" , fn ); sprintf(transhead.Response,"%10s",' '); sprintf(transhead.Message,"%100s",' '); sprintf( transhead.TransLength , "%10d" , 0 ); } */ transhead.compressed = '0'; printf("Begin Send\n"); c_bufflen = /*HEADLEN +*/ Sendbufferlen; sprintf( (char *)lenbuff , "%06d" , c_bufflen); strcpy( (char *) c_buff , (char *) lenbuff ); //strncpy( tmp_transhead, (const char *)&transhead, HEADLEN ); //strcat( (char *) c_buff , (char *)tmp_transhead ); strcat( (char *) c_buff , (char *)SendBuffer ); lLen = strlen(c_buff); printf("c_buff=[%s]\n",c_buff); Res = Write_Sock( connfd , c_buff, lLen ); if( Res != lLen ) { printf("W_data error\n"); *RetCode=104; sprintf(RetMsg,"Send error(Client write data error)"); close(connfd); msocket_id = -1; return -1; } int readLen = 0; if( (readLen = Read_Sock( connfd,tmp_buf,12,SOCK_TIMEOUT )) != 12 ) { printf("read confirm error and readLen=[%d], socket=[%d]\n", readLen, connfd); //return 0; } printf("End Send data\n"); *RetCode=0; sprintf(RetMsg,"Send success!"); return 0;}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Reset()//功能描述: 通讯类状态重置//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Reset(){ socket_id = -1; msocket_id = -1; connfd = -1; return 0;}//------------------------------------------------------------------- //函数名: ComSocket_lzSer::Close()//功能描述: 关闭通讯端口//作 者: 陈熹//日 期: 2002-10-21//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- int ComSocket_lzSer::Close(){ close(connfd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -