📄 com_wzser.cpp
字号:
//------------------------------------------------------------------- //文件名:ComSocket_wzSer.cpp//创建人:陈熹//日 期:2002-10-21//修改人://日 期://描 述:AS400通讯模块(服务端)//版 本://Copyright (c) 2002 EITOP//------------------------------------------------------------------- #include "Com_wzser.h"///////////////////////////////////////////////////////////////////////////////// 构造函数ComSocket_wzSer::ComSocket_wzSer(){ char tmpbuf[1+1]; socket_id = -1; msocket_id = -1; connfd = -1; memset(PORT, 0x0, sizeof(PORT)); memset(tmpbuf, 0x0, sizeof(tmpbuf)); ComFunction::GetConcreteClassOnePameterValue("ComSocket_wzSer", "port", PORT); ComFunction::GetConcreteClassOnePameterValue("ComSocket_wzSer", "logleval", tmpbuf); err_log = atoi(tmpbuf);}/////////////////////////////////////////////////////////////////////////////////析构函数ComSocket_wzSer::~ComSocket_wzSer(){}/////////////////////////////////////////////////////////////////////////////////打开通讯端口int ComSocket_wzSer::Open(){ //申请新的Sock结束 if( socket_id == -1 ) { 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;}/////////////////////////////////////////////////////////////////////////////////开始服务int ComSocket_wzSer::Service(){ int nsel,maxfd; size_t clilen; fd_set rset,mset; struct sockaddr_in Sin; char *ipAddres = NULL; FD_ZERO(&mset); FD_SET(socket_id, &mset); maxfd = socket_id; rset = mset; printf("ComSocket_wzSer通讯程序处于select状态\n"); if( msocket_id == -1 ) { 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) || //Software caused connection abort (errno == EPROTO) || //Protocol error (errno == ENOSR) || //out of streams resources (errno == EINTR)) //interrupted system call { return 9; } else { printf("accept error=[%d]\n",errno); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"accept error=[%d]\n",errno); return (-1); } } msocket_id = connfd; memset(clientIp, 0, 16); ipAddres = new char[16]; memset(ipAddres, 0, 16); ipAddres = inet_ntoa(Sin.sin_addr); memcpy(clientIp, ipAddres, strlen(ipAddres)); delete [] ipAddres; printf("Accept client socket=[%d] IP=[%s]\n", msocket_id, clientIp); return 0; } } return -1;}/////////////////////////////////////////////////////////////////////////////////接收数据函数int ComSocket_wzSer::Recv(char* RecvBuffer, int& RecvBufferLen, int& RetCode, char* RetMsg){ int Res; long i_bufflen; unsigned char buff[COMMAXBUFF]; unsigned char lenbuff[10]; memset( buff, 0x0, sizeof(buff)); memset( lenbuff, 0x0, sizeof(lenbuff)); //先收取4个字节的长度 if((Res = Recvmbbuf(connfd, (char *)lenbuff, 6, SOCK_TIMEOUT) ) != 6 ) { if( Res == TIMEOUTERRNO ) { //printf("R_head timeout\n"); //close (connfd); //msocket_id = -1; return TIMEOUTERRNO; } if( Res == -2 ) { printf("Client_Socket disconnect\n"); close (connfd); msocket_id = -1; return -2; } //sco:9-Bad file number,13-Permission denied //aix:31-such file or directory,17-File exists if( errno == 13 || errno == 9 || errno == 31 ||errno ==17 ) { printf("read errmsg=[%s]\n",strerror(errno)); close (connfd); msocket_id = -1; return -2; } 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(i_bufflen <= 10) { printf("Error receive invalid message reason len=[%d] too short\n", i_bufflen); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"Error receive invalid message reason " "len=[%d] too short\n", i_bufflen); return 2; } printf("RecvBufferLen=[%d]\n", i_bufflen); int recdLen = 0; if((recdLen=Recvmbbuf(connfd,(char *)buff, i_bufflen, SOCK_TIMEOUT )) != i_bufflen ) { //printf("recved leng:%d\n", recdLen); RetCode = 104; sprintf(RetMsg,"Read error(read Client data error)"); printf("read buff error\n"); //if( err_log==7||err_log==1 ) // LogPro(__FILE__,__LINE__,1,"Read error(read Client data error)\n"); //close (connfd); //msocket_id = -1; return TIMEOUTERRNO; } //memcpy( RecvBuffer,(char *)buff, i_bufflen ); strcpy(RecvBuffer, (char *)buff); RecvBufferLen = i_bufflen; RetCode = 0; //printf("recd:%s", RecvBuffer); sprintf(RetMsg,"信息收取成功"); return 0;}/////////////////////////////////////////////////////////////////////////////////发送数据函数int ComSocket_wzSer::Send(char* SendBuffer, char* Sendmsg, int Sendbufferlen, int* RetCode, char** RetMsg){ char tmp_buf[5]; unsigned char c_buff[COMMAXBUFF]; unsigned char lenbuff[10]; long i_bufflen; memset( tmp_buf,'\0',sizeof(tmp_buf) ); memset( c_buff,'\0',sizeof(c_buff) ); memset( lenbuff,'\0',sizeof(lenbuff) ); if(strlen(SendBuffer)<=0) { int len = strlen(Sendmsg); sprintf( (char *)lenbuff , "%06d" , (len)); memcpy((char *)c_buff, lenbuff, 6); memcpy((char *)(c_buff+6), Sendmsg, len); i_bufflen = strlen((char *)c_buff); } else { int len = strlen(SendBuffer); sprintf( (char *)lenbuff , "%06d" , (len)); memcpy((char *)c_buff, lenbuff, 6); memcpy((char *)(c_buff+6), SendBuffer, len); i_bufflen = strlen((char *)c_buff); } if( Write_Sock( connfd,(char *)c_buff,i_bufflen ) != i_bufflen ) { printf("write buff error\n"); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"write buff error\n"); //close (connfd); //msocket_id = -1; return (-1); } printf("Send buffer=[%d][%s]", i_bufflen, c_buff); //int readLen = 0; //if( (readLen = Read_Sock( connfd,tmp_buf,4,SOCK_TIMEOUT )) != 4 ) //{ // printf("read confirm error and readLen=[%d], socket=[%d]\n", readLen, connfd); // return 0; //} //printf("Call Rrecv end\n"); return 0;}/////////////////////////////////////////////////////////////////////////////////发送心跳消息int ComSocket_wzSer::SentHeartMsg(char* HeartMsg){ int len = strlen(HeartMsg); char strComfirm[5]; memset(strComfirm, 0, 5); if( Write_Sock( connfd,(char *)HeartMsg, len) != len ) { printf("write HeartMsg to Socket error\n"); if( err_log==7||err_log==1 ) LogPro(__FILE__,__LINE__,1,"write HeartMsg to Socket error\n"); close (connfd); msocket_id = -1; return (-1); } //if( Read_Sock( connfd, strComfirm, 4, SOCK_TIMEOUT ) != 4 ) //{ // printf("read confirm timeout\n"); // return -1; //} return 0;}///////////////////////////////////////////////////////////////////////////////// 通讯类状态重置int ComSocket_wzSer::Reset(){ socket_id = -1; msocket_id = -1; connfd = -1; return 0;}/////////////////////////////////////////////////////////////////////////////////关闭通讯端口int ComSocket_wzSer::Close(){// close(msocket_id);// close(socket_id); close(connfd); connfd = -1; return 0;}//////////////////////////////////////////////////////////////////////////////////停止指定的套接字int ComSocket_wzSer::Close(int socket){ close(socket); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -