int doProcess(CTcpSocket &acpsocket) { int ret = 0; int send_len = 0; char recv_buf[4096] = ""; char send_buf[4096] = ""; acpsocket.Recv(recv_buf, sizeof(recv_buf), g_para.bank_timeout); ret=strlen(recv_buf); writelog(LOG_INFO,"len[%d],recv_buf[%s]\n",ret,recv_buf); ret = doResponse(recv_buf,strlen(recv_buf),send_buf,send_len); if(ret) { if(ret>0) return ret; } send_buf[send_len]=0; writelog(LOG_INFO,"len[%d],send_buf[%s]\n",send_len,send_buf); ret = acpsocket.Send(send_buf,send_len); if(ret != send_len) { writelog(LOG_ERR,"发送数据错误\n"); return -1; } return 0; }
void CNetBackend::socket_check_cb(ev::timer &w, int32 revents) { if ( EV_ERROR & revents ) { GERROR() << "check socket connect timeout call back error:" << strerror(errno) << "\n"; w.stop(); abort_work( "socket_check_cb fail" ); } int64 _now = ev_now(loop); CTcpSocket *psocket = null; vector<CTcpSocket *>::iterator itr = m_tcp_sockets.begin(); while ( itr != m_tcp_sockets.end() ) { psocket = *itr; itr ++; if ( !psocket ) //this fd not use continue; if ( ES_CONNECTED == psocket->get_socket_status() && _now - psocket->get_connect_time() > DISCONNECT_TIMEOUT ) { psocket->close_socket(); //该状态未与游戏服建立连接,可以直接关闭 psocket->set_socket_status( ES_NONE ); } } }
int main() { CTcpServer server; server.passiveOpen(5566, 10, true); char *c = new char[SZ_BUF]; for (int i = 0; i < SZ_BUF; i++) c[i] = (char)0xaa; CTcpSocket *conn = server.accept(); ReadingThread reading(*conn, (char)0x55); reading.start(); unsigned bytecount = 0; CTime st = CTime::now(); while ((CTime::now() - st) < CTime(T_SEND, 0)) { bytecount += conn->write(c, SZ_BUF); } CTime sendtime = CTime::now() - st; conn->close(); cout << "Sent " << bytecount << " bytes." << endl; cout << "Sending rate = " << ((double)bytecount * 8 / 1048576 * 1000000 / sendtime.toMicroseconds()) << " Mbps" << endl; reading.setDone(); reading.join(); CTime recvtime = CTime::now() - reading.tstart(); cout << "Received " << reading.bytecount() << " bytes." << endl; cout << "Receiving rate = " << ((double)reading.bytecount() * 8 / 1048576 * 1000000 / recvtime.toMicroseconds()) << " Mbps" << endl; delete [] c; return 0; }
int CTcpSocket::DealNewSocket(SOCKET newsock, int connId, char* ip, int port) { CTcpSocket *pNewSocket = new CTcpSocket(); if (pNewSocket == NULL) { closesocket(newsock); return -1; } if (pNewSocket->CreateRecvBuf(m_nBufSize) < 0) { delete pNewSocket; closesocket(newsock); return -1; } if (m_pListenSockFunc != NULL) { m_pListenSockFunc(this, (char*)ip, port, 0, pNewSocket, m_pListenUserData); } // 变成客户端的连接类 int ret = pNewSocket->SetSocket(newsock, connId, ip, port, m_pListenSockFunc, m_pListenUserData, (void*)this); if (ret < 0) { if (m_pListenSockFunc != NULL) { m_pListenSockFunc(this, (char*)ip, port, -1, pNewSocket, m_pListenUserData); } } return 1; }
void CTcpSocket::on_accept_callback(evutil_socket_t sock, short flag, void* p) { CTcpSocket* psocket = (CTcpSocket*)(p); if (psocket && (flag&EV_READ)) { psocket->on_inter_listen_accept(sock); } }
void CTcpSocket::on_send_callback(evutil_socket_t sock, short flag, void* p) { CTcpSocket* psocket = (CTcpSocket*)(p); if (psocket) { psocket->on_inter_send(flag); } }
CTcpSocket* CTcpSocket::Create(void) { CTcpSocket* socket = CTcpSocket::m_pool.New_Object(); if (socket) { socket->Set_DestoryCB([](CPPRef* ref){ CTcpSocket::m_pool.Delete_Object(dynamic_cast<CTcpSocket*>(ref)); }); } return socket; }
int main() { bool flag = false; int childpid = 0; char *inifile = "transconfig.ini"; CTcpSocket tcpsocket ; CTcpSocket sockettmp ; openlog("yktbank_gateway",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL3); if( !ReadIni(inifile)) { printf("读取配置文件[%s]失败\n",inifile); return -1; } writelog(LOG_DEBUG,"drtp_ip[%s],drtp_port[%d],mainfuncno[%d],list_port[%d]",g_para.drtp_ip, g_para.drtp_port, g_para.main_funcno,g_para.bank_lisnport); printf("\n drtp_ip[%s],drtp_port[%d],mainfuncno[%d],list_port[%d]\n",g_para.drtp_ip, g_para.drtp_port, g_para.main_funcno,g_para.bank_lisnport); if(!KS_YKT_Clt::Initialize(g_para.drtp_ip, g_para.drtp_port, g_para.main_funcno)) { printf("----------初始化通讯平台失败----------\n"); return -1; } signal(SIGCHLD,SIG_IGN); signal(SIGINT,SIG_DFL); flag = tcpsocket.Create(); if(!flag) exit(1); flag = tcpsocket.Listen(g_para.bank_lisnport); if(!flag) exit(1); while(1) { flag = tcpsocket.Accept(sockettmp); if(!flag) continue; if ((childpid = fork()) == 0) /* 子进程 */ { tcpsocket.Close(); doProcess(sockettmp); /* 处理请求 */ sockettmp.Close(); exit(0); } else if(childpid < 0) { printf("创建子进程失败\n"); } sockettmp.Close(); /* 父进程 */ } tcpsocket.Close(); KS_YKT_Clt::Uninitialize(); closelog(); return 0; }
void CNetBackend::add_socket( int32 fd,const struct sockaddr_in address ) { if ( fd > MAX_FD ) { GERROR() << "add_socket MAX_FD limit\n"; return; } while ( (fd > static_cast<int32>(m_tcp_sockets.size()-1)) && (MAX_FD > m_tcp_sockets.size()) ) //-1数组下标从0开始 { m_tcp_sockets.resize( DEFAULT_SOCKETS,null ); GWARNING() << "socket vector resize occured\n"; } CTcpSocket *psocket = m_tcp_sockets[fd]; if ( null == psocket ) { m_tcp_sockets[fd] = new CTcpSocket();//该构造函数初始化变量 psocket = m_tcp_sockets[fd]; } psocket->uninit_socket(); //clean old data psocket->set_socket_fd( fd ); psocket->set_socket_address( address ); psocket->init_socket(); psocket->set_socket_status( ES_CONNECTED ); psocket->set_connect_time( ev_now(loop) ); //use ev_now() instead of time() psocket->start(); }
DWORD WINAPI CTcpSocket::ThreadFunc(LPVOID pParam) { DWORD dwWaitStatus; // holds return value of the wait CTcpSocket * p = (CTcpSocket *)pParam; // connection-specific data while (TRUE) { // Wait for an event dwWaitStatus = WSAWaitForMultipleEvents(3, p->m_eventArray, FALSE, // fWaitAll WSA_INFINITE, // dwTimeout FALSE); // fAlertable switch (dwWaitStatus) { case WSA_WAIT_FAILED: // A fatal error OutputDebugString(_T("WSAWaitForMultipleEvents() failed\n")); break; case WSA_WAIT_EVENT_0: // The hNetEvent has been signaled. if (p->HandleNetworkEvent()) { continue; } break; case WSA_WAIT_EVENT_0+1: // The hOutputEvent has been signaled. if (p->HandleOutputEvent()) { continue; } break; case WSA_WAIT_EVENT_0+2: // Quit time; OutputDebugString(_T("Hangup by myself\n")); break; default: OutputDebugString(_T("Unknown error in WSAWaitForMultipleEvents()\n")); break; } // switch (dwWaitStatus) // Break out of the while loop. break; } // while (1) // Thread is ending because the connection was closed or an error occurred p->CleanUp(); return 0; }
int doProcess(CTcpSocket &acpsocket) { printf("\n doProcess3 \n"); int ret = 0; int pack_len = 0; int send_len = 0; char recv_buf[4096] = ""; char send_buf[4096] = ""; //ret = acpsocket.Recv(recv_buf, HEAD_LEN, g_para.bank_timeout); //ret = acpsocket.Recv(recv_buf, 2048, g_para.bank_timeout); //ret = acpsocket.Recv(recv_buf, sizeof(recv_buf), g_para.bank_timeout); acpsocket.Recv(recv_buf, sizeof(recv_buf), g_para.bank_timeout); ret=strlen(recv_buf); printf("\n recv_buf[%s] \n len[%d] ret[%d]\n",recv_buf,strlen(recv_buf),ret); // if(ret != HEAD_LEN) // { // writelog(LOG_ERR,"接收银行数据包头错误\n"); // return -1; // } // pack_len = atoi(recv_buf); // ret = acpsocket.Recv(recv_buf, pack_len, g_para.bank_timeout); // if(ret != pack_len) // { // writelog(LOG_ERR,"接收银行数据包体错误\n"); // return -1; // } // recv_buf[pack_len]=0; writelog(LOG_INFO,"len[%d],recv_buf[%s]\n",ret,recv_buf); ret = doResponse(recv_buf,pack_len,send_buf,send_len); if(ret) { if(ret>0) return ret; } send_buf[send_len]=0; writelog(LOG_INFO,"len[%d],send_buf[%s]\n",send_len,send_buf); ret = acpsocket.Send(send_buf,send_len); if(ret != send_len) { writelog(LOG_ERR,"发送数据错误\n"); return -1; } return 0; }
bool sendQueryIPByName_DDNS(CDvrDevice* device, char *name, int namelen) { unsigned char data[HEADER_SIZE + 64]; memset(data, 0, HEADER_SIZE + 64); data[0] = 0x81; DWORD datalen = (namelen <= 64) ? namelen : 64; (*(DWORD*)(data+4)) = datalen;//datalen; data[8] = 50; data[9] = 0; //0.单记录查询 1.查询所有在线记录 memcpy(data+HEADER_SIZE, name, datalen); CTcpSocket *tcp = device->GetTcpSocket(); if (tcp) { if (tcp->WriteData((char*)data, HEADER_SIZE + 64) >= 0) { return true; } } return false; }
int doProcess(CTcpSocket &acpsocket) { int ret = 0; int pack_len = 0; int send_len = 0; char recv_buf[256] = ""; char send_buf[256] = ""; ret = acpsocket.Recv(recv_buf, HEAD_LEN, g_para.bank_timeout); if(ret != HEAD_LEN) { writelog(LOG_ERR,"接收银行数据包头错误\n"); return -1; } pack_len = atoi(recv_buf); ret = acpsocket.Recv(recv_buf, pack_len, g_para.bank_timeout); if(ret != pack_len) { writelog(LOG_ERR,"接收银行数据包体错误\n"); return -1; } recv_buf[pack_len]=0; writelog(LOG_INFO,"len[%d],recv_buf[%s]\n",ret,recv_buf); ret = doResponse(recv_buf,pack_len,send_buf,send_len); if(ret) { if(ret>0) return ret; } send_buf[send_len]=0; writelog(LOG_INFO,"len[%d],send_buf[%s]\n",strlen(send_buf),send_buf); ret = acpsocket.Send(send_buf,send_len); if(ret != send_len) { writelog(LOG_ERR,"发送数据错误\n"); return -1; } return 0; }
bool CTcpSocket::Accept(CTcpSocket& nNew) { nNew.Close(); struct sockaddr_in nInAddress; socklen_t nSize = sizeof(nInAddress); int fd = accept(m_nFd, (struct sockaddr*)&nInAddress, &nSize); if (fd == -1) return false; nNew.m_nFd = fd; nNew.m_strHost = inet_ntoa(nInAddress.sin_addr); nNew.m_nPort = (unsigned int)ntohs(nInAddress.sin_port); return true; }
bool CTcpSocket::Accept(CTcpSocket &sock, char *remote) { int tempsocket; struct sockaddr_in addr; addr.sin_family=m_nAddressFamily; SOCKADDRLEN addrlen = sizeof(addr); tempsocket = accept( m_socket, (struct sockaddr*)&addr, &addrlen); if(tempsocket < 0) { return false; } sock.Attach(tempsocket,m_nAddressFamily); if (remote!=NULL) strcpy(remote,inet_ntoa(addr.sin_addr)); return(true); }
static int send_to_bank(const std::string& req, std::string& resp) { int timeout = 0; string ytc_ip; int ytc_port; int ret; ret = get_ec_para(YTCEC_TIMEOUT, timeout); if (ret) { LOG(ERROR, "中银通超时时限未配置"); return E_COMMON_ERR; } timeout*=1000; ret = get_ec_para(YTCEC_SVRIP, ytc_ip); if (ret) { LOG(ERROR, "中银通前置机未配置"); return E_COMMON_ERR; } ret = get_ec_para(YTCEC_SVRPORT, ytc_port); if (ret) { LOG(ERROR, "中银通前置机未配置"); return E_COMMON_ERR; } LOG(DEBUG, "中银通服务器[" << ytc_ip << ":" << ytc_port << "]"); CTcpSocket sock; alarm(timeout / 1000); if (!sock.ConnectTcp((char*)ytc_ip.c_str(), ytc_port)) { alarm(0); LOG(ERROR, "connect to ytc error"); return E_COMMON_ERR; } alarm(0); // 中银通报文 stringstream ss; ss << setw(4) << setfill('0') << req.length() << req; LOG(DEBUG, "中银通报文[" << ss.str() << "]"); if (sock.Send((char*)ss.str().c_str(), ss.str().length()) < (int)ss.str().length()) { LOG(ERROR, "Send to ytc error"); return E_COMMON_ERR; } // 包头 size_t body_len = 0; { char buffer[5] = {0}; if (sock.Recv(buffer, 4, timeout) <= 0) { LOG(ERROR, "Recv body head from ykc error"); return E_COMMON_ERR; } istringstream is(buffer); is >> body_len; } // 包体 string body; { char* buffer = new char[body_len + 1]; memset(buffer, 0, body_len + 1); if (sock.Recv(buffer, body_len, timeout) <= 0) { LOG(ERROR, "Recv body from ykc error"); delete [] buffer; return E_COMMON_ERR; } body = buffer; delete [] buffer; resp = body; } return 0; }
void CIOServer::Run() { epoll_event events[10000]; int retCount = 0; bool bRuning = true; unsigned int timerTime = GetTimeMillisecond(); while (true) { retCount = epoll_wait(m_epoll, events, 10000, 1000); if (retCount == -1) { if (errno != EINTR) { LCD("ERR: epoll_wait err! errno=" <<strerror(errno)); break; } continue; } //check timer { unsigned int curTime = GetTimeMillisecond(); if (curTime - timerTime > 1000) { timerTime = curTime; m_cb->OnTimer(); } if (retCount == 0) continue;//timeout } for (int i=0; i<retCount; i++) { int eventflag = events[i].events; tagRegister * pReg = (tagRegister *)events[i].data.ptr; //tagHandle type if (pReg->_type == tagRegister::REG_THREAD) { char buf[1000]; while (recv(pReg->_socket, buf, 1000, 0) > 0){} MsgVct msgs; m_msglock.Lock(); msgs = m_msgs; m_msgs.clear(); m_msglock.UnLock(); for (MsgVct::iterator iter = msgs.begin(); iter != msgs.end(); ++iter) { if (iter->first == PCK_EPOLL_EXIT) { LCD("INFO: epoll recv exit event"); bRuning = false; continue; } else if (iter->first == PCK_ACCEPT_CLOSE) { CTcpAccept * p = (CTcpAccept *) iter->second; p->OnPostClose(); } else if (iter->first == PCK_SOCKET_CLOSE) { CTcpSocket *p = (CTcpSocket*)iter->second; p->OnPostClose(); } else if (iter->first == PCK_USER_DATA) { m_cb->OnMsg(iter->second); } } } else if (pReg->_type == tagRegister::REG_ACCEPT) { CTcpAccept *pKey = (CTcpAccept *) pReg->_ptr; if (eventflag & EPOLLIN) { pKey->OnEPOLLMessage(true); } if (eventflag & EPOLLERR || eventflag & EPOLLHUP) { pKey->OnEPOLLMessage(false); } } else { if (pReg->_type != tagRegister::REG_RECV && pReg->_type != tagRegister::REG_SEND && pReg->_type != tagRegister::REG_CONNECT) { LCE("check register event type failed !! type=" << pReg->_type); continue; } CTcpSocket *pKey = (CTcpSocket *) pReg->_ptr; pKey->OnEPOLLMessage(pReg->_type, eventflag); } } if (!bRuning) { break; } } LCD("INFO: epoll loop exit"); }
int send_to_and_recv_from_bank_of_boc(char* pSend, int send_len,char* pRecv,int *recv_len,int max_recv_len,int delay_time) { struct SockNode SockNode,SockNode_rsp; CTcpSocket sock; char bank_ip[20]=""; int bank_port=0; int bank_port_rsp=0; //int delay_time=0; int ret=0; char temp[5]=""; int length=0; TIniFile tf; if (!tf.Open(TRANS_INI_FILE)) { writelog(LOG_ERR,"Cann't open ini file,file=[%s]\n",TRANS_INI_FILE); return E_TRANS_UNKNOW_ERROR; } tf.ReadString("BANK", "BANK_IP", "127.0.0.1", bank_ip,sizeof(bank_ip)); bank_port=tf.ReadInt("BANK", "BANK_PORT",9001); bank_port_rsp=tf.ReadInt("BANK", "BANK_PORT_RSP",9002); if(0==delay_time) delay_time=tf.ReadInt("BANK", "BANK_DELAY_TIME", 3000); tf.Close(); #ifdef DEBUG //printf("BANK_IP=[%s],BANK_PORT[%d],DELAY_TIME[%d]\n",bank_ip,bank_port,delay_time); #endif writelog(LOG_DEBUG,"connect to bank [%s][%d][%d]",bank_ip,bank_port,bank_port_rsp); //连接银行 ret=SockNode.hSock.ConnectTcp(bank_ip, bank_port,5); if(!ret) { writelog(LOG_ERR,"Connect to bank error,error code is [%d],bank_ip[%s],port[%d] ",ret,bank_ip,bank_port); return E_TRANS_BANK_NETERR; } //发送数据到银行 ret=SockNode.hSock.Send(pSend, send_len); if (ret<0) { // 发送时,端口有问题,包括被关闭 writelog(LOG_ERR,"Send to bank error,ret = %ret, error code is [%d] ",ret, errno); return E_TRANS_BANK_NETERR; } else if (0==ret) { // 不应该出现这种情况 writelog(LOG_ERR,"Send to bank error,CTcpSocket.Send should not return this error,error code is[%d]!\n",errno); return E_TRANS_BANK_NETERR; } writelog(LOG_DEBUG,"send to bank success, waiting for responsing!!"); sleep(1); if(!sock.Create()) { writelog(LOG_ERR,"sock.Create error!\n"); return E_TRANS_BANK_NETERR; } if(!sock.Listen(bank_port_rsp)) { writelog(LOG_ERR,"sock.Listen error![%d]",errno); return E_TRANS_BANK_NETERR; } CTcpSocket rcv_sock; if(sock.Accept(rcv_sock)) { int rcvlen = rcv_sock.Recv(pRecv,max_recv_len,delay_time); if(rcvlen < 0) { writelog(LOG_ERR,"sock.Recv error![%d][%d]\n",rcvlen,errno); return E_TRANS_BANK_NOANSWER; } writelog(LOG_DEBUG,"recv length[%d]",rcvlen); *recv_len=rcvlen; return 0; } return E_TRANS_BANK_NOANSWER; /* ret=SockNode_rsp.hSock.Listen(bank_port_rsp); if(!ret) { char msg[256]=""; SockNode_rsp.hSock.GetLastError(msg); writelog(LOG_ERR,"Listen bank error,error code is[%d],msg=[%s]!\n",ret,msg); return E_TRANS_BANK_NETERR; } CTcpSocket rcv_sock; ret=SockNode_rsp.hSock.Accept(rcv_sock); if(ret) { int rcvlen = SockNode.hSock.Recv(pRecv,max_recv_len,delay_time); if(rcvlen < 0) { char msg[256]=""; SockNode_rsp.hSock.GetLastError(msg); writelog(LOG_ERR,"Receive from bank error,error code is[%d],msg=[%s]!\n",ret,msg); return E_TRANS_BANK_NETERR; } *recv_len=rcvlen; SockNode.hSock.Close(); SockNode_rsp.hSock.Close(); rcv_sock.Close(); return 0; } return -2; */ }
void CIOServer::RunOnce() { if (m_io == NULL || m_cb == NULL) { LCF("Can't Run Once. server not initialize or initialize false."); return; } DWORD dwTranceCount = 0; ULONG_PTR uComKey = NULL; LPOVERLAPPED pOverlapped = NULL; BOOL bRet = GetQueuedCompletionStatus(m_io, &dwTranceCount, &uComKey, &pOverlapped, 1000/*INFINITE*/); //检查定时器超时状态 { unsigned int curTime = GetTimeMillisecond(); if (curTime - m_lasttime > 1000) { m_lasttime = curTime; m_cb->OnTimer(); } if (!bRet && !pOverlapped) { //TIMEOUT return; } } //! 检查自定义通知 if (uComKey == PCK_ACCEPT_CLOSE) { CTcpAccept *pp = (CTcpAccept *) (ULONG_PTR)pOverlapped; pp->OnClear(); return; } else if (uComKey == PCK_SOCKET_CLOSE) { CTcpSocket *pp = (CTcpSocket*) (ULONG_PTR)pOverlapped; pp->OnClear(); return; } else if (uComKey == PCK_USER_DATA) { m_cb->OnPost((void *)pOverlapped); return; } //! 处理来自网络的通知 unsigned char type = ((tagReqHandle*)pOverlapped)->_type; switch (type) { case tagReqHandle::HANDLE_ACCEPT: { CTcpAccept *pKey = (CTcpAccept *) uComKey; pKey->OnIOCPMessage(bRet); } break; case tagReqHandle::HANDLE_RECV: case tagReqHandle::HANDLE_SEND: case tagReqHandle::HANDLE_CONNECT: { CTcpSocket *pKey = (CTcpSocket *) uComKey; pKey->OnIOCPMessage(bRet, dwTranceCount, type); } break; default: LCE("GetQueuedCompletionStatus undefined type=" << type); } }
int F1005(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { *pRetCode=-1; ST_CPACK aPack; CCcbTrans CcbTran(in_pack); CCcbTrans *pTrans = &CcbTran; if(!pTrans->AssignReqHead()) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } pTrans->prepare(); if(!pTrans->replaceTemlateVarValue()) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } CTcpSocket tcpSocket; int ret = -1; string bankReqData,bankRepData; if(!pTrans->buildBankRequestData(pTrans->getTemplateData(),bankReqData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } if(pTrans->debug) cout<<"bankReqData : "<<bankReqData<<endl; if(!tcpSocket.ConnectTcp((char*)pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port)) { *pRetCode=9999; sprintf(szMsg,"连接建设银行IP[%s]Port[%d] 失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } ret = tcpSocket.Send((char*)bankReqData.c_str(),bankReqData.length()); if(ret!=bankReqData.length()) { *pRetCode=9999; sprintf(szMsg,"发送数据到建设银行IP[%s]Port[%d] 失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } CCBMSGHEAD ccbMsgHead; char *pccbMsgHead =(char*) &ccbMsgHead; ret = tcpSocket.Recv(pccbMsgHead, sizeof(ccbMsgHead), pTrans->pBank->getNCService().timeout*1000); if(ret<=0) { char errBuf[256]; *pRetCode=9999; tcpSocket.GetLastError(errBuf); sprintf(szMsg,"从建设银行IP[%s]Port[%d] 接收数据失败,Error: %s\n",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port,errBuf); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } if(pTrans->debug) { cout<<"length: "<< ccbMsgHead.msgDataLen<<"type: " <<ccbMsgHead.commMode<<endl; cout<<ccbMsgHead.txCode <<" curblock : "<<ccbMsgHead.curBlock<<"totalblock : "<<ccbMsgHead.totalBlock<<endl; } int len = atoi(ccbMsgHead.msgDataLen); char *pRcvBuf=(char*)malloc(len+1); ret = tcpSocket.Recv(pRcvBuf, len, pTrans->pBank->getNCService().timeout*1000); if(ret<=0) { *pRetCode=9999; sprintf(szMsg,"从建设银行IP[%s]Port[%d] 接收数据失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } tcpSocket.Close(); pRcvBuf[len] =0; bankRepData = string(pRcvBuf,len); if(pTrans->debug) cout<<"报文: bankRepData:"<<bankRepData<<endl; free(pRcvBuf); string fileName; if(getNodeValByNodeName(bankRepData, "FileName", fileName)) { string repFile = "ccbRepFile"; fileName.erase(0,fileName.find('\\')); repFile += fileName; string::size_type pos=0; while( (pos=repFile.find('\\', pos)) != string::npos) { repFile.replace(pos, 1, "/"); pos += 1; } if(pTrans->debug) cout<<"xml file name: "<<repFile<<endl; std::ifstream ifs(repFile.c_str()); if(!ifs.good()) { return -1; } istreambuf_iterator<char> beg(ifs),end; bankRepData = string(beg,end); ifs.close(); } string bankData; if(!pTrans->parseBankResponseData(bankRepData,bankData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } if(!pTrans->buildResponseData(handle,&aPack,bankData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } *pRetCode=0; return 0; }
int F1004(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret=0; *pRetCode=-1; ST_CPACK aPack; CTcpSocket tcpSocket; CBcomTrans BcomTran(in_pack); CTrans *pTrans = &BcomTran; if(!pTrans->AssignReqHead()) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } pTrans->prepare(); if(!pTrans->replaceTemlateVarValue()) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } string signReqData; if(!pTrans->buildSignData(signReqData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } if(pTrans->debug) cout<<"signReqData: "<<signReqData.c_str()<<endl; if(!tcpSocket.ConnectTcp((char*)pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port)) { *pRetCode=9999; sprintf(szMsg,"连接交通银行IP[%s]Port[%d] 失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } ret = tcpSocket.Send((char*)signReqData.c_str(),signReqData.length()); if(ret!=signReqData.length()) { *pRetCode=9999; sprintf(szMsg,"发送数据到交通银行IP[%s]Port[%d] 失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } char szBufLen[8]=""; int timout=pTrans->pBank->getNCService().timeout*1000; ret = tcpSocket.Recv(szBufLen, 7, timout); if(ret<=0) { *pRetCode=9999; sprintf(szMsg,"从交通银行IP[%s]Port[%d] 接收数据失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); return -1; } if(pTrans->debug) cout<<"报文长度 : "<<szBufLen<<endl; int len = atol(szBufLen+1); char *pRcvBuf=(char*)malloc(len+1); if(!pRcvBuf) { *pRetCode=9999; sprintf(szMsg,"从交通银行IP[%s]Port[%d] 接收数据失败",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); free(pRcvBuf); return -1; } ret = tcpSocket.Recv(pRcvBuf, len, timout); if(ret<0) { char errBuf[256]; *pRetCode=9999; tcpSocket.GetLastError(errBuf); sprintf(szMsg,"从交通银行IP[%s]Port[%d] 接收数据失败,errMsg:[%s]",pTrans->pBank->getNCService().ip.c_str(),pTrans->pBank->getNCService().port,errBuf); cout<<szMsg<<endl; writelog(LOG_ERR,szMsg); free(pRcvBuf); return -1; } tcpSocket.Close(); pRcvBuf[len] = 0; if(pTrans->debug) cout<<pRcvBuf<<endl; string bankVerifyData(pRcvBuf,len); free(pRcvBuf); string bankData; if(!pTrans->parseVerifyBankSignedData(bankVerifyData,bankData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } if(pTrans->debug) cout<<"bankData: "<<bankData<<endl; if(!pTrans->buildResponseData(handle,&aPack,bankData)) { strcpy(szMsg,pTrans->getErrMsg().c_str()); cout<<szMsg<<endl; return -1; } *pRetCode=0; return 0; }
//按照通用接口规范进行封装各自银行的接口 int Bank_Trans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char host[16]=""; //对方机器的ip short port = 0; int timeout = 0; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); CTcpSocket tcpsocket ; // TRANS_REQ trans_req; // TRANS_ANS trans_ans; // memset(&trans_req,0x20,sizeof trans_req); // 先填充上空格 // memset(&trans_ans,0x20,sizeof trans_ans); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_SDATE1,F_SCERT_NO,0); char buf[256] = " "; char tmp[8] = ""; des2src(host,rPack->scust_auth); // 银行ip port=rPack->lvol0; // 银行端口 timeout = rPack->lvol1; // 等待银行超时时间 memset(buf,0x20,sizeof buf); // 填充空格 sprintf(buf,"%04d",REQ_PACK_LEN); // 包体长度 strcpy(buf+4,TRANS_CODE); // 交易码 STRLENCPY(buf+8, rPack->sdate0,8); // 交易日期 STRLENCPY(buf+16, rPack->sholder_ac_no,14); // 一卡通交易参考号 STRLENCPY(buf+30, rPack->sphone,32); // 学工号 STRLENCPY(buf+62, rPack->scust_limit,32); // 姓名 STRLENCPY(buf+94,rPack->scust_auth2,18); // 身份证号 STRLENCPY(buf+112,rPack->scust_limit2,32); // 银行卡号 sprintf(buf+144,"%-17.2f",rPack->damt0); // 交易金额 ret = tcpsocket.ConnectTcp(host, port); if(!ret) { writelog(LOG_ERR,"Connect to bank error,error code is [%d],ip_addr[%s],port[%d] ",ret,host,port); return E_TRANS_CONNECT; } buf[REQ_PACK_LEN+4]=0; writelog(LOG_INFO,"trans send[%s]",buf); ret = tcpsocket.Send(buf,REQ_PACK_LEN+4); if (ret<0) { // 发送时,端口有问题,包括被关闭 writelog(LOG_ERR,"Send to bank error,error code is [%d] ",ret); return E_TRANS_REQUEST; } else if(0==ret){ // 不应该出现这种情况 writelog(LOG_ERR,"Send to bank,CTcpSocket.Send should not return this error,error code is[%d]!\n",ret); return E_TRANS_REQUEST; } ret = tcpsocket.Recv(buf, ANS_PACK_LEN+4, timeout); tcpsocket.Close(); buf[ANS_PACK_LEN+4]=0; writelog(LOG_INFO,"trans recv[%s],recvlen[%d]",buf,ret); if (ret!=ANS_PACK_LEN+4) { out_pack->lvol1 = -1; //超时 或 接收数据错误 ,后台应向银行发冲正 strcpy(szMsg,"接收银行数据错误"); goto r_ret; } memcpy(tmp,buf,4); if(atoi(tmp) != ANS_PACK_LEN) { out_pack->lvol1 = -1; //接收数据错误,后台应向银行发冲正 strcpy(szMsg,"接收银行数据错误"); goto r_ret; // 接收时候出错,或超时 } memcpy(tmp,buf+20,6); if(strncmp(tmp,"000000",6)!=0) // 银行端处理错误 { memcpy(szMsg,buf+26,34); return E_TRANS_BANK_RECVERR; } else { out_pack->lvol1 = 1; memcpy(out_pack->sdate1,buf+12,8); // 银行流水号 memcpy(out_pack->scert_no,buf+26,34); // 银行返回信息 } writelog(LOG_INFO,"bankretinfo[%s],lvol1[%d]",out_pack->scert_no,out_pack->lvol1); r_ret: PutRow(handle,out_pack,pRetCode,szMsg); return 0; }
int F250001(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char host[16]=""; //对方机器的ip short port=0; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); //char senddata[327]=""; //char rcvdata[327]=""; CTcpSocket tcpsocket ; ext_phone_trans_t PhoneTrans; //memset(senddata,0x20,sizeof senddata); //memset(rcvdata,0x20,sizeof rcvdata); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_SSECTYPES,0); des2src(host,rPack->scust_auth); port=rPack->lvol0; memset(&PhoneTrans,0,sizeof(PhoneTrans)); memcpy(&PhoneTrans, rPack->ssectypes,127); memset(PhoneTrans.plugdata,0x20,sizeof(PhoneTrans.plugdata)); memcpy(PhoneTrans.signcheck,gSignCheck,strlen(gSignCheck)); //writelog(LOG_ERR,"package_send=[%s] ",rPack->ssectypes); writelog(LOG_INFO,"Connect to boss system ip_addr[%s],port[%d] ",host,port); ret = tcpsocket.ConnectTcp(host, port); if(!ret) { writelog(LOG_ERR,"Connect to boss system error,error code is [%d],ip_addr[%s],port[%d] ",ret,host,port); *pRetCode=E_MOBILE_TRANS_CONNECT; goto l_ret; } printf("send:[%s]\n",(char*)&PhoneTrans); ret = tcpsocket.Send((char*)&PhoneTrans,sizeof(PhoneTrans)); if (ret<0) { // 发送时,端口有问题,包括被关闭 writelog(LOG_ERR,"Send to boss system error,error code is [%d] ",ret); *pRetCode=E_MOBILE_TRANS_REQUEST; goto l_ret; } else if(0==ret){ // 不应该出现这种情况 writelog(LOG_ERR,"Send to boss system error,CTcpSocket.Send should not return this error,error code is[%d]!\n",ret); *pRetCode=E_MOBILE_TRANS_REQUEST; goto l_ret; } memset(&PhoneTrans,0,sizeof(PhoneTrans)); if(rPack->lvol1==1) { ret = tcpsocket.Recv((char*)&PhoneTrans, sizeof(PhoneTrans), 15000); tcpsocket.Close(); if (ret!=327) { writelog(LOG_ERR,"Receive from boss system error,error code is [%d] ",ret); *pRetCode=E_MOBILE_TRANS_TIME_OUT; goto l_ret; // 接收时候出错,或超时 } printf("trans recv:[%s]\n",(char*)&PhoneTrans); // memcpy(out_pack->ssectypes,&PhoneTrans,127); if(strncmp(PhoneTrans.retnum,"00",2)!=0) { if(strncmp(PhoneTrans.retnum,"01",2)==0) { writelog(LOG_ERR,"trans error,mac error,ret[%s] ",PhoneTrans.retnum); *pRetCode=E_MOBILE_CHECK_MAC; goto l_ret; } if(strncmp(PhoneTrans.retnum,"02",2)==0) { writelog(LOG_ERR,"trans falied ret[%s] ",PhoneTrans.retnum); *pRetCode=E_MOBILE_TRANS_FAILURE; goto l_ret; } } else { writelog(LOG_INFO,"trans success ret[%s] ","00"); } }else{ ret=tcpsocket.Recv((char*)&PhoneTrans, sizeof(PhoneTrans), 15000); tcpsocket.Close(); if (ret!=327) { writelog(LOG_ERR,"Receive from boss system error,error code is [%d] ",ret); *pRetCode=E_MOBILE_TRANS_TIME_OUT; goto l_ret; // 接收时候出错,或超时 } printf("query recv:[%s]\n",(char*)&PhoneTrans); // memcpy(out_pack->ssectypes,&PhoneTrans,127); if(strncmp(PhoneTrans.retnum,"00",2)!=0) { if(strncmp(PhoneTrans.retnum,"01",2)==0) { writelog(LOG_ERR,"query error,mac error,ret[%s] ",PhoneTrans.retnum); *pRetCode=E_MOBILE_CHECK_MAC; goto l_ret; } if(strncmp(PhoneTrans.retnum,"02",2)==0) { writelog(LOG_ERR,"query falied ret[%s] ",PhoneTrans.retnum); *pRetCode=E_MOBILE_CHECK_FAIL; goto l_ret; } } else { writelog(LOG_INFO,"query success ret[%s] ","00"); } } //writelog(LOG_ERR,"package_recv=[%s] ",out_pack->ssectypes); PutRow(handle,out_pack,pRetCode,szMsg); return 0; l_ret: return -1; }
void CTcpSocket::on_inter_listen_accept(evutil_socket_t listenfd) { socketaddr acceptaddr; ev_socklen_t addrlen = sizeof(acceptaddr); evutil_socket_t newfd = ::accept(listenfd, (struct sockaddr*)&acceptaddr, &addrlen); if (newfd == INVALID_SOCKET) { XH_LOG_ERROR(logname_base, "[id:" << m_id << "] tcpsocket listener::accept failed, ip:" << m_localip << ", port : " << m_localport); return; } CTcpSocket* newsocket = CTcpSocket::Create(); if (!newsocket) { closetcpsocket(newfd); return; } XH_GUARD([&]{newsocket->Release(); }); m_lcb->On_Accept(GetSocketID(), newsocket); if (newsocket->m_io && newsocket->m_type == type_accepter) { std::string peerip; unsigned int peerport = 0; sockaddr2ipport(&acceptaddr, addrlen, peerip, peerport); newsocket->Retain(); newsocket->m_io->Post(std::bind(&CTcpSocket::on_inter_accept_accept, newsocket, newfd, peerip, peerport)); } else { closetcpsocket(newfd); switch (newsocket->m_type) { case type_listener: if (newsocket->m_lcb) { newsocket->m_lcb->Release(); newsocket->m_lcb = 0; } break; case type_accepter: if (newsocket->m_acb) { newsocket->m_acb->Release(); newsocket->m_acb = 0; } break; case type_connecter: if (newsocket->m_ccb) { newsocket->m_ccb->Release(); newsocket->m_ccb = 0; } break; default: break; } XH_LOG_ERROR(logname_base, "[id:" << m_id << "] tcpsocket listener ITcpSocketCB::On_Accept failed or not be accepted by user, ip:" << m_localip << ", port : " << m_localport); } }
int doProcess(CTcpSocket &acpsocket) { printf("\n doProcess3 \n"); int ret = 0; int pack_len = 0; int send_len = 0; char recv_buf[4096] = ""; char send_buf[4096] = ""; //ret = acpsocket.Recv(recv_buf, HEAD_LEN, g_para.bank_timeout); //ret = acpsocket.Recv(recv_buf, 2048, g_para.bank_timeout); //ret = acpsocket.Recv(recv_buf, sizeof(recv_buf), g_para.bank_timeout); acpsocket.Recv(recv_buf, sizeof(recv_buf), g_para.bank_timeout); ret=strlen(recv_buf); printf("\n recv_buf[%s] \n len[%d] ret[%d]\n",recv_buf,strlen(recv_buf),ret); // if(ret != HEAD_LEN) // { // writelog(LOG_ERR,"接收银行数据包头错误\n"); // return -1; // } // pack_len = atoi(recv_buf); // ret = acpsocket.Recv(recv_buf, pack_len, g_para.bank_timeout); // if(ret != pack_len) // { // writelog(LOG_ERR,"接收银行数据包体错误\n"); // return -1; // } // recv_buf[pack_len]=0; writelog(LOG_INFO,"len[%d],recv_buf[%s]\n",ret,recv_buf); ret = doResponse(recv_buf,strlen(recv_buf),send_buf,send_len); if(ret) { if(ret>0) return ret; } send_buf[send_len]=0; writelog(LOG_INFO,"len[%d],send_buf[%s]\n",send_len,send_buf); printf("\n xxxxxxxxxxxxxxxxx \nsend_buf[%s]\nsend_len[%d]\n xxxxxxxxxxxxxxxx\n",send_buf); ret = acpsocket.Send(send_buf,send_len); //ret = acpsocket.Send("1234",4); /* int ret=0; int send_len=strlen(send_buf); char buf[2048]={0}; ret=SockNode->Send(send_buf,send_len); if (ret<=0) { SockNode->Close(); set_msg_log(szMsg,"发送数据至银行出错,错误代码[%d]\n",ret); return false; } */ if(ret != send_len) { writelog(LOG_ERR,"发送数据错误\n"); return -1; } return 0; }
bool CTcpSocket::OpenSocketPair(CTcpSocket& nIn, CTcpSocket& nOut) { #if defined(WIN32) CTcpSocket nServer; nServer.SetAddress("127.0.0.1", 0); if (!nServer.Open()) { AILOG_ERROR() << "OpenSocketPair[Open] error," << CTcpSocket::LastErrorMessage(); return false; } if (!nServer.Listen()) { AILOG_ERROR() << "OpenSocketPair[Listen] error," << CTcpSocket::LastErrorMessage(); return false; } std::string strHost; int nPort; if (!nServer.GetLocalAddress(strHost, nPort)) { AILOG_ERROR() << "OpenSocketPair[GetLocalAddress] error," << CTcpSocket::LastErrorMessage(); return false; } nIn.SetAddress("127.0.0.1", nPort); if (!nIn.Open()) { AILOG_ERROR() << "OpenSocketPair[Open client] error," << CTcpSocket::LastErrorMessage(); return false; } nIn.SetOptNB(true); if (!nIn.Connect()) { if (!CTcpSocket::IsNoneFatal()) { nIn.Close(); AILOG_ERROR() << "OpenSocketPair[Connect] error," << CTcpSocket::LastErrorMessage(); return false; } } if (!nServer.Accept(nOut)) { nIn.Close(); AILOG_ERROR() << "OpenSocketPair[Accept] error," << CTcpSocket::LastErrorMessage(); return false; } nIn.SetOptNB(false); return true; #else int fds[2]; if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) != 0) { AILOG_ERROR() << "OpenSocketPair[socketpair] error," << CTcpSocket::LastErrorMessage(); return false; } nIn.m_nFd = fds[0]; nOut.m_nFd = fds[1]; return true; #endif }