void NetMgr_Android_Impl::Update(float dt) { if (m_nSocket <= 0) return; // read from socket ReceiveOnce(); // write to socket SendOnce(); }
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; }
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; } }
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(); } }
//////////////////////////////////////////////////////////////////////////////// // 函数名: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); }