void LogonCommServerSocket::SendPacket(WorldPacket * data) { bool rv; LockWriteBuffer(); logonpacket header; header.opcode = data->GetOpcode(); EndianConvert(header.opcode); header.size = (uint32)data->size(); EndianConvertReverse(header.size); if(use_crypto) sendCrypto.Process((unsigned char*)&header, (unsigned char*)&header, 6); rv = WriteButHold((uint8*)&header, 6); if(data->size() > 0 && rv) { if(use_crypto) sendCrypto.Process((unsigned char*)data->contents(), (unsigned char*)data->contents(), (uint32)data->size()); rv = Write(data->contents(), (uint32)data->size()); } else if(rv) ForceSend(); UnlockWriteBuffer(); }
void LogonCommClientSocket::SendPacket(WorldPacket * data, bool no_crypto) { logonpacket header; bool rv; if(!m_connected || m_deleted) return; LockWriteBuffer(); header.opcode = data->GetOpcode(); EndianConvert(header.opcode); header.size = (uint32)data->size(); EndianConvertReverse(header.size); if(use_crypto && !no_crypto) _sendCrypto.Process((unsigned char*)&header, (unsigned char*)&header, 6); rv = WriteButHold((const uint8*)&header, 6); if(data->size() > 0 && rv) { if(use_crypto && !no_crypto) _sendCrypto.Process((unsigned char*)data->contents(), (unsigned char*)data->contents(), (unsigned int)data->size()); rv = Write((const uint8*)data->contents(), (uint32)data->size()); } else if(rv) rv = ForceSend(); UnlockWriteBuffer(); }
OUTPACKET_RESULT WorldSocket::_OutPacket(uint16 opcode, size_t len, const void* data, bool InWorld) { bool rv; if(!IsConnected()) return OUTPACKET_RESULT_NOT_CONNECTED; if( GetWriteBuffer()->GetSpace() < (len+4) ) return OUTPACKET_RESULT_NO_ROOM_IN_BUFFER; /* if(InWorld) { if(Uniques.find(opcode) == Uniques.end()) { Log.Notice("", "Sent packet %s (0x%03X)", LookupOpcodeName(opcode), uint(opcode), uint(opcode)); Uniques.insert(opcode); } } else if(opcode != SMSG_UPDATE_OBJECT && opcode != SMSG_PONG && opcode != SMSG_WORLD_STATE_UI_TIMER_UPDATE && opcode != SMSG_WEATHER) printf("Sent packet %s (0x%03X)\n", LookupOpcodeName(opcode), uint(opcode), uint(opcode));*/ LockWriteBuffer(); // Encrypt the packet // First, create the header. ServerPktHeader Header; Header.cmd = opcode; Header.size = ntohs((uint16)len + 2); _crypt.EncryptSend((uint8*)&Header, sizeof (ServerPktHeader)); // Pass the header to our send buffer rv = WriteButHold((const uint8*)&Header, 4); // Pass the rest of the packet to our send buffer (if there is any) if(len > 0 && rv) rv = Write((const uint8*)data, (uint32)len); else if(rv) rv = ForceSend(); UnlockWriteBuffer(); if(len > 0 && rv && !bServerShutdown) sWorld.NetworkStressOut += float(float(len+4)/1024); return rv ? OUTPACKET_RESULT_SUCCESS : OUTPACKET_RESULT_SOCKET_ERROR; }
void WSClient::SendPacket(WorldPacket * data) { bool rv; uint32 size = (uint32)data->size(); uint16 opcode = data->GetOpcode(); if(!IsConnected()) return; LockWriteBuffer(); // Pass the header to our send buffer rv = WriteButHold((const uint8*)&opcode, 2); rv = WriteButHold((const uint8*)&size, 4); // Pass the rest of the packet to our send buffer (if there is any) if(size > 0 && rv) rv = Write((const uint8*)data->contents(), size); else if(rv) rv = ForceSend(); UnlockWriteBuffer(); }