void CImConn::OnRead() { for (;;) { uint32_t free_buf_len = m_in_buf.GetAllocSize() - m_in_buf.GetWriteOffset(); if (free_buf_len < READ_BUF_SIZE) m_in_buf.Extend(READ_BUF_SIZE); int ret = netlib_recv(m_handle, m_in_buf.GetBuffer() + m_in_buf.GetWriteOffset(), READ_BUF_SIZE); if (ret == 0) { log("close on netlib_recv=0"); OnClose(); return; } else if (ret < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { break; } else { log("close on error=%d", errno); OnClose(); return; } } m_recv_bytes += ret; m_in_buf.IncWriteOffset(ret); m_last_recv_tick = get_tick_count(); } CImPdu* pPdu = NULL; try { while ( ( pPdu = CImPdu::ReadPdu(m_in_buf.GetBuffer(), m_in_buf.GetWriteOffset()) ) ) { uint32_t pdu_len = pPdu->GetLength(); HandlePdu(pPdu); m_in_buf.Read(NULL, pdu_len); delete pPdu; pPdu = NULL; // ++g_recv_pkt_cnt; } } catch (CPduException& ex) { log("!!!catch exception, sid=%u, cid=%u, err_code=%u, err_msg=%s, close the connection ", ex.GetServiceId(), ex.GetCommandId(), ex.GetErrorCode(), ex.GetErrorMsg()); if (pPdu) { delete pPdu; pPdu = NULL; } OnClose(); } }
void CImConn::OnRead() { for (;;) { uint32_t free_buf_len = m_in_buf.GetAllocSize() - m_in_buf.GetWriteOffset(); if (free_buf_len < READ_BUF_SIZE) m_in_buf.Extend(READ_BUF_SIZE); int ret = netlib_recv(m_handle, m_in_buf.GetBuffer() + m_in_buf.GetWriteOffset(), READ_BUF_SIZE); if (ret <= 0) break; m_recv_bytes += ret; m_in_buf.IncWriteOffset(ret); m_last_recv_tick = get_tick_count(); } if (m_policy_conn) { return; } // no received data is read by ReadPdu(), check if this is a flash security policy request if (m_recv_bytes == m_in_buf.GetWriteOffset()) { if ( (m_in_buf.GetBuffer()[0] == '<') && (g_policy_content != NULL) ) { log("policy request, handle=%d\n", m_handle); m_policy_conn = true; Send(g_policy_content, g_policy_len); return; } } try { CImPdu* pPdu = NULL; while ( ( pPdu = CImPdu::ReadPdu(m_in_buf.GetBuffer(), m_in_buf.GetWriteOffset()) ) ) { uint32_t pdu_len = pPdu->GetLength(); HandlePdu(pPdu); m_in_buf.Read(NULL, pdu_len); delete pPdu; ++g_recv_pkt_cnt; } } catch (CPduException& ex) { log("!!!catch exception, sid=%u, cid=%u, err_code=%u, err_msg=%s, close the connection\n", ex.GetModuleId(), ex.GetCommandId(), ex.GetErrorCode(), ex.GetErrorMsg()); OnClose(); } }
void CImConn::OnRead() { while (true) { uint32_t free_buf_len = m_in_buff.GetAllocSize() - m_in_buff.GetWriteOffset(); if (free_buf_len < READ_BUF_SIZE) { m_in_buff.Extend(READ_BUF_SIZE); } int ret = netlib_recv(m_handle, m_in_buff.GetBuffer() + m_in_buff.GetWriteOffset(), READ_BUF_SIZE); if (ret <= 0) { break; } m_recv_bytes += ret; m_in_buff.IncWriteOffset(ret); m_last_recv_tick = get_tick_count(); } if (m_policy_conn) { return; } if (m_recv_bytes == m_in_buff.GetWriteOffset()) { if ((m_in_buff.GetBuffer()[0] == '<') && (g_policy_content != NULL)) { m_policy_conn = true; Send(g_policy_content, g_policy_len); return; } } CImPdu *pPdu = NULL; while ((pPdu = CImPdu::ReadPdu(m_in_buff.GetBuffer(), m_in_buff.GetWriteOffset()))) { uint32_t pdu_len = pPdu->GetLength(); HandlePdu(pPdu); m_in_buff.Read(NULL, pdu_len); delete pPdu; ++g_recv_pkt_cnt; } }
void CGroupChat::HandleGroupInfoResponse(CImPdu* pPdu) { IM::Group::IMGroupInfoListRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t user_id = msg.user_id(); uint32_t group_cnt = msg.group_info_list_size(); CPduAttachData pduAttachData((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length()); log("HandleGroupInfoResponse, user_id=%u, group_cnt=%u. ", user_id, group_cnt); //此处是查询成员时使用,主要用于群消息从数据库获得msg_id后进行发送,一般此时group_cnt = 1 if (pduAttachData.GetPduLength() > 0 && group_cnt > 0) { IM::BaseDefine::GroupInfo group_info = msg.group_info_list(0); uint32_t group_id = group_info.group_id(); log("GroupInfoRequest is send by server, group_id=%u ", group_id); std::set<uint32_t> group_member_set; for (uint32_t i = 0; i < group_info.group_member_list_size(); i++) { uint32_t member_user_id = group_info.group_member_list(i); group_member_set.insert(member_user_id); } if (group_member_set.find(user_id) == group_member_set.end()) { log("user_id=%u is not in group, group_id=%u. ", user_id, group_id); return; } IM::Message::IMMsgData msg2; CHECK_PB_PARSE_MSG(msg2.ParseFromArray(pduAttachData.GetPdu(), pduAttachData.GetPduLength())); CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(SID_MSG); pdu.SetCommandId(CID_MSG_DATA); //Push相关 IM::Server::IMGroupGetShieldReq msg3; msg3.set_group_id(group_id); msg3.set_attach_data(pdu.GetBodyData(), pdu.GetBodyLength()); for (uint32_t i = 0; i < group_info.group_member_list_size(); i++) { uint32_t member_user_id = group_info.group_member_list(i); msg3.add_user_id(member_user_id); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(member_user_id); if (pToImUser) { CMsgConn* pFromConn = NULL; if( member_user_id == user_id ) { uint32_t reqHandle = pduAttachData.GetHandle(); if(reqHandle != 0) pFromConn = CImUserManager::GetInstance()->GetMsgConnByHandle(user_id, reqHandle); } pToImUser->BroadcastData(pdu.GetBuffer(), pdu.GetLength(), pFromConn); } } CImPdu pdu2; pdu2.SetPBMsg(&msg3); pdu2.SetServiceId(SID_OTHER); pdu2.SetCommandId(CID_OTHER_GET_SHIELD_REQ); CDBServConn* pDbConn = get_db_serv_conn(); if (pDbConn) { pDbConn->SendPdu(&pdu2); } } else if (pduAttachData.GetPduLength() == 0) { //正常获取群信息的返回 CMsgConn* pConn = CImUserManager::GetInstance()->GetMsgConnByHandle(user_id, pduAttachData.GetHandle()); if (pConn) { msg.clear_attach_data(); pPdu->SetPBMsg(&msg); pConn->SendPdu(pPdu); } } }