Example #1
0
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();
}
Example #2
0
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();
}
Example #3
0
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();
}
Example #5
0
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();
}