int F849014(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret=0; int card_id = 0; T_t_pif_card tCard; char buf[64] = ""; char comments[256] = ""; char reqdata[1024] = ""; char temp[1024] = ""; ST_CPACK aPack; ST_PACK* out_pack = &(aPack.pack); char svr_ip[21 ] = ""; int svr_port = 0; CTcpSocket sock; KSG_GW_PACK_t * resp = NULL; if(strlen(in_pack->sname) < 1) { *pRetCode = E_INPUT_DORM_NO; goto L_RETU; } ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_VSMESS,0); ret = GetPowerServerInfo(svr_ip,&svr_port); if(ret) { *pRetCode = ret; goto L_RETU; } gw_server_info_t svrinfo; des2src(svrinfo.server_ip,svr_ip); svrinfo.server_port = svr_port; svrinfo.sock = &sock; AddXmlItemStr(temp,XML_KEY_DORM_NO,in_pack->sname); writelog(LOG_DEBUG,"xml[%s]",temp); sprintf(reqdata,"<YKT_DATA>%s</YKT_DATA>",temp); writelog(LOG_DEBUG,"xml[%s]",reqdata); ret = SendToServer(&svrinfo,QUERY_DORM_NAME,reqdata); if(ret) { writelog(LOG_DEBUG,"电控返回数据[%d]",ret); *pRetCode =ret; goto L_RETU; } ret = RecvFromServer(&svrinfo,&resp); if(ret) { writelog(LOG_DEBUG,"电控返回数据[%d]",ret); *pRetCode = ret; goto L_RETU; } else { if(resp->func_no != QUERY_DORM_NAME || resp->retcode != 0) { writelog(LOG_DEBUG,"funcno [%d] ret[%d]",resp->func_no,resp->retcode); *pRetCode = E_POWER_RECV_ERR; goto L_RETU; } des2src(reqdata,resp->data); ret = GetXmlValue(comments,sizeof comments,XML_KEY_DORM_NAME,reqdata); if(ret) { writelog(LOG_DEBUG,"无数据[%s][%d]",reqdata,ret); *pRetCode = ret; goto L_RETU; } des2src(out_pack->vsmess,comments); PutRow(handle,out_pack,pRetCode,szMsg); } if(resp) free(resp); return 0; L_RETU: if(resp) free(resp); return -1; }
int CEpollClient::RunFun() { int isocketfd = -1; for(int iuserid=0; iuserid<m_iUserCount; iuserid++) { struct epoll_event event; isocketfd = ConnectToServer(iuserid, m_ip, m_iPort); if(isocketfd < 0) cout <<"[CEpollClient error]: RunFun, connect fail" <<endl; m_iSockFd_UserId[isocketfd] = iuserid;//将用户ID和socketid关联起来 event.data.fd = isocketfd; event.events = EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP; m_pAllUserStatus[iuserid].uEpollEvents = event.events; epoll_ctl(m_iEpollFd, EPOLL_CTL_ADD, event.data.fd, &event); } int flag=0; struct timeval val1,val2; gettimeofday(&val1,NULL); while(!flag){ struct epoll_event events[_MAX_SOCKFD_COUNT]; gettimeofday(&val2,NULL); //if((val2.tv_sec -val1.tv_sec)>10) //flag=1; char buffer[1024]; memset(buffer,0,1024); int nfds = epoll_wait(m_iEpollFd, events, _MAX_SOCKFD_COUNT, 100 );//等待epoll事件的产生 for (int ifd=0; ifd<nfds; ifd++)//处理所发生的所有事件 { struct epoll_event event_nfds; int iclientsockfd = events[ifd].data.fd; //cout << "events[ifd].data.fd: " << events[ifd].data.fd << endl; int iuserid = m_iSockFd_UserId[iclientsockfd];//根据socketfd得到用户ID if( events[ifd].events & EPOLLOUT ) { int iret = SendToServerData(iuserid); if( 0 < iret ) { event_nfds.events = EPOLLIN|EPOLLERR|EPOLLHUP; event_nfds.data.fd = iclientsockfd; epoll_ctl(m_iEpollFd, EPOLL_CTL_MOD, event_nfds.data.fd, &event_nfds); } else { cout <<"[CEpollClient error:] EpollWait, SendToServerData fail, send iret:"<<iret<<",iuserid:"<<iuserid<<",fd:"<<events[ifd].data.fd<<endl; DelEpoll(events[ifd].data.fd); CloseUser(iuserid); } } else if( events[ifd].events & EPOLLIN )//监听到读事件,接收数据 { int ilen = RecvFromServer(iuserid, buffer, 1024); if(0 > ilen) { cout <<"[CEpollClient error]: RunFun, recv fail, reason is:"<<strerror(errno)<<",errno is:"<<errno<<endl; DelEpoll(events[ifd].data.fd); CloseUser(iuserid); } else if(0 == ilen) { cout <<"[CEpollClient warning:] server disconnect,ilen:"<<ilen<<",iuserid:"<<iuserid<<",fd:"<<events[ifd].data.fd<<endl; DelEpoll(events[ifd].data.fd); CloseUser(iuserid); } else { read_num++; m_iSockFd_UserId[iclientsockfd] = iuserid;//将socketfd和用户ID关联起来 event_nfds.data.fd = iclientsockfd; event_nfds.events = EPOLLOUT|EPOLLERR|EPOLLHUP; //event_nfds.events = EPOLLERR|EPOLLHUP; epoll_ctl(m_iEpollFd, EPOLL_CTL_MOD, event_nfds.data.fd, &event_nfds); } } else { cout <<"[CEpollClient error:] other epoll error"<<endl; DelEpoll(events[ifd].data.fd); CloseUser(iuserid); } } } printf("read: %d\n",read_num); }