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(); }
void TcpSocket::OnWrite(size_t len) { /* Lock the buffer so nothing can modify it */ LockWriteBuffer(); /* This is called when the socket engine gets an event on the socket */ #ifdef NETLIB_IOCP /* Data has already been output to the socket, we can clear the buffer */ if(!len) { Disconnect(); return; } m_writeBuffer->Remove(len); /* Do we still have data to write? */ if(m_writeBuffer->GetSize()) sSocketEngine.WantWrite(this); else InterlockedDecrement(&m_writeLock); #else /* Push as much data out as we can in a nonblocking fashion. */ int bytes = send(m_fd, (const char*)m_writeBuffer->GetBufferOffset(), m_writeBuffer->GetSize(), 0); if(bytes < 0) Disconnect(); else m_writeBuffer->Remove(bytes); #endif /* Unlock the write buffer, we're finished */ UnlockWriteBuffer(); }