Example #1
0
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;
}
Example #2
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 );
        }
    }
}
Example #3
0
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;
}
Example #4
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;
}
Example #5
0
	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);
		}
	}
Example #6
0
	void CTcpSocket::on_send_callback(evutil_socket_t sock, short flag, void* p)
	{
		CTcpSocket* psocket = (CTcpSocket*)(p);
		if (psocket)
		{
			psocket->on_inter_send(flag);
		}
	}
Example #7
0
	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;
	}
Example #8
0
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;
}
Example #9
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();
}
Example #10
0
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;
}
Example #11
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;
}
Example #12
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;
}
Example #13
0
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;
}
Example #14
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;
}
Example #15
0
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);
}
Example #16
0
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;
}
Example #17
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");
}
Example #18
0
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;
	*/
}
Example #19
0
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);
    }

}
Example #20
0
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;
}
Example #21
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;
}
Example #22
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;
}
Example #23
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;
}
Example #24
0
	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);
		}
	}
Example #25
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,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;
}
Example #26
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
}