Esempio n. 1
0
void NetMgr_Android_Impl::Update(float dt)
{
	if (m_nSocket <= 0) return;

	// read from socket
	ReceiveOnce();

	// write to socket
	SendOnce();
}
Esempio n. 2
0
bool NetMgr_Android_Impl::SendNetMessage(INetMsgBase* pMsg)
{
	StreamWriter writer;
	if (!pMsg->ToStream(&writer))
	{
		LOGE("SendNetMessage %s::ToStream failed", pMsg->GetRtti()->GetTypeName());
		return false;
	}

	int length = writer.GetBufferSize();
	const void* pszBuffer = writer.GetBuffer();
	m_SendBuffer.Write(pszBuffer, length);

	SendOnce();
	return true;
}
Esempio n. 3
0
void CClient::MessageEntry(zsummer::protocol4z::ReadStream & rs)
{
	//协议流异常会被上层捕获并关闭连接
	unsigned short protocolID = 0;
	rs >> protocolID;
	switch (protocolID)
	{
	case 1:
		{
			unsigned long long clientTick = 0;
			m_recvTextCache.clear();
			rs >> clientTick >> m_recvTextCache;
			if (g_startType == 0)
			{
				DoSend(protocolID, clientTick, m_recvTextCache.c_str());
			}
			else
			{
				unsigned long long tick = NOW_TIME;
				if (tick < clientTick)
				{
					LOGE("now time[" << tick << "] < last time[" << clientTick << "].");
					throw std::runtime_error("now time < last time");
				}
				tick -= clientTick;
				m_lastDelayTime = tick;
				m_process.AddTotalEcho(1);
				m_process.AddTotalEchoTime(tick);
				if (g_sendType == 0)
				{
					SendOnce();
				}
			}
		}
		break;
	default:
		{
			LOGI("unknown protocol id = " << protocolID);
		}
		break;
	}
}
Esempio n. 4
0
void CClient::OnConnected(zsummer::network::ErrorCode ec)
{
	if (ec)
	{
		LOGD("OnConnected failed. ec=" << ec);
		return;
	}
	LOGD("OnConnected success");
	DoRecv();
	m_bEstablished = true;
	m_process.AddTotalOpen(1);
	if (g_intervalMs > 0)
	{
		m_process.GetZSummer().CreateTimer(g_intervalMs, std::bind(&CClient::SendOnce, shared_from_this()));
	}
	else
	{
		SendOnce();
	}
}
Esempio n. 5
0
////////////////////////////////////////////////////////////////////////////////
//	函数名:INT SendData(
//				SOCKET hSocket,
//				LPCSTR pszBuffer,
//				INT nBufferSize,
//				DWORD dwTimeout )
//	用  途:发送数据
//	对全局变量的影响:无
//	参  数:
//		hSocket     : 待发送的套接字
//		pszBuffer   : 发送数据缓冲区
//		nBufferSize : 缓冲区大小
//		dwTimeout   : 发送超时
//	返回值:INT
//		>=0			: 成功,已成功发送的字节数
//		<0			: 失败(SOCKET_FAIL:-1)
////////////////////////////////////////////////////////////////////////////////
INT CBufSocket::SendData(SOCKET hSocket, LPCSTR pszBuffer, INT nBufferSize, DWORD dwTimeout)
{
    HANDLE	hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (hWriteEvent == NULL)
    {
        SetLastError( (INT)GetLastError() );
        return (SOCKET_FAIL);
    }

    INT nSendBytes = 0;

    for (;;)
    {
        ////////////////////////////////////////////////////////////////
        // 发送数据成功
        if ((nSendBytes = SendOnce(hSocket, pszBuffer, nBufferSize)) >= 0)
            break;

        INT nErrorCode = -nSendBytes;

        if (nErrorCode != WSAEWOULDBLOCK)
        {
            CloseHandle(hWriteEvent);
            SetLastError( WSAGetLastError() );
            return (SOCKET_FAIL);
        }


        ///////////////////////////////////////////////////////////////////////////////
        //  睡眠一段时间
        ///////////////////////////////////////////////////////////////////////////////
        Sleep(DEFAULT_BLOCKED_SNDRCV_SLEEP);

        // 注册FD_WRITE | FD_CLOSE 事件
        if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE|FD_CLOSE) == SOCKET_ERROR)
        {
            CloseHandle(hWriteEvent);
            SetLastError( WSAGetLastError() );
            return (SOCKET_FAIL);
        }

        // 等待事件发生
        DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);

        if (dwWaitResult != WSA_WAIT_EVENT_0)
        {
            // 清除网络事件
            WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
            CloseHandle(hWriteEvent);
            SetLastError( WSAGetLastError() );
            return (SOCKET_FAIL);
        }

        //////////////////////////////////////////////////////////////
        ///	注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该
        ///			进一步检查网络是否发生错误
        ///////////////////////////////////////////////////////////////
        WSANETWORKEVENTS NetEvent;
        if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
        {
            // 清除网络事件
            WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
            CloseHandle(hWriteEvent);
            SetLastError( WSAGetLastError() );
            return (SOCKET_FAIL);
        }
        if( ( NetEvent.lNetworkEvents == FD_CLOSE ) ||
                ( NetEvent.lNetworkEvents == FD_WRITE   &&
                  NetEvent.iErrorCode[FD_WRITE_BIT] !=0 ) )	// 发生错误
        {
            // 清除网络事件
            WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
            CloseHandle(hWriteEvent);
            SetLastError( WSAGetLastError() );
            return (SOCKET_FAIL);
        }
        // 清除网络事件
        WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
    }

    CloseHandle(hWriteEvent);
    return (nSendBytes);
}