コード例 #1
0
ファイル: WorldSocket.cpp プロジェクト: AscNHalf/AscNHalf
void WorldSocket::OutPacket(uint16 opcode, size_t len, const void* data)
{
	OUTPACKET_RESULT res;
	if( (len + 10) > WORLDSOCKET_SENDBUF_SIZE )
	{
		printf("WARNING: Tried to send a packet of %u bytes (which is too large) to a socket. Opcode was: %u (0x%03X)\n", (unsigned int)len, (unsigned int)opcode, (unsigned int)opcode);
		return;
	}

	res = _OutPacket(opcode, len, data);
	if(res == OUTPACKET_RESULT_SUCCESS)
		return;

	if(res == OUTPACKET_RESULT_NO_ROOM_IN_BUFFER)
	{
		/* queue the packet */
		queueLock.Acquire();
		//WorldPacket * pck = new WorldPacket(opcode, len);
		WorldPacket * pck = g_bufferPool.Allocate(len);
		pck->SetOpcode(opcode);
		if(len) pck->append((const uint8*)data, len);
		_queue.Push(pck);
		queueLock.Release();
	}
}
コード例 #2
0
ファイル: WorldSocket.cpp プロジェクト: dberga/arcbliz
void WorldSocket::UpdateQueuedPackets()
{
	queueLock.Acquire();
	if(!_queue.HasItems())
	{
		queueLock.Release();
		return;
	}

	WorldPacket* pck;
	while((pck = _queue.front()) != NULL)
	{
		/* try to push out as many as you can */
		switch(_OutPacket(pck->GetOpcode(), pck->size(), pck->size() ? pck->contents() : NULL))
		{
			case OUTPACKET_RESULT_SUCCESS:
				{
					delete pck;
					_queue.pop_front();
				}
				break;

			case OUTPACKET_RESULT_NO_ROOM_IN_BUFFER:
				{
					/* still connected */
					queueLock.Release();
					return;
				}
				break;

			default:
				{
					/* kill everything in the buffer */
					while((pck == _queue.Pop()) != 0)
					{
						delete pck;
					}
					queueLock.Release();
					return;
				}
				break;
		}
	}
	queueLock.Release();
}