public void DisconnectClient(SOEClient client, ushort reason, bool clientBased = false) { // Disconnect Log("Disconnecting client on {0} (ID: {1}) for reason: {2}", client.GetClientAddress(), client.GetClientID(), (SOEDisconnectReasons)reason); // Are they a connected client? if (Clients.Contains(client)) { // We don't care about them anymore // Open their ID as a space Host2ClientID.Remove(client.Client); SessionID2ClientID.Remove(client.GetSessionID()); Clients[client.GetClientID()] = null; } // Was this a disconnect request from the client itself? if (!clientBased) { // Tell them we're disconnecting them SOEWriter packetWriter = new SOEWriter((ushort)SOEOPCodes.DISCONNECT); // Arguments packetWriter.AddUInt32(client.GetSessionID()); packetWriter.AddUInt16(reason); // Send! SOEPacket packet = packetWriter.GetFinalSOEPacket(client, true, false); client.SendPacket(packet); } }
private void SendMessage(SOEMessage message) { // Setup a writer SOEWriter writer = new SOEWriter((ushort)SOEOPCodes.RELIABLE_DATA); // Sequence number ushort sequenceNumber = GetNextSequenceNumber(); writer.AddUInt16(sequenceNumber); // Add the message writer.AddMessage(message); // Get the final packet and send it! SOEPacket packet = writer.GetFinalSOEPacket(Client, true, true); Client.SendPacket(packet); // TODO repeat-till-acknowledged }
private void ReceivedSequenceOutOfOrder(ushort sequenceNumber) { // Setup a writer SOEWriter writer = new SOEWriter((ushort)SOEOPCodes.OUT_OF_ORDER_RELIABLE_DATA); // Where abouts did the sending mess up? writer.AddUInt16(sequenceNumber); // Send the packet SOEPacket packet = writer.GetFinalSOEPacket(Client, true, true); Client.SendPacket(packet); }
private void SendFragmentedMessage(SOEMessage message) { // Are we already busy? if (BusySendingFragmentedPacket) { // The already-busy thread will pick up our message.. FragmentedQueue.Enqueue(message); return; } // Set that we're busy IMMEDIATELY! (thread-safe) BusySendingFragmentedPacket = true; // Setup the for loop SOEWriter writer; SOEPacket packet; ushort sequenceNumber; bool sentInitial = false; // The rest aren't any different for (int i = 0; i < message.GetFragmentCount(); i++) { // Setup a new writer writer = new SOEWriter((ushort)SOEOPCodes.FRAGMENTED_RELIABLE_DATA); // Are we the first packet? if (!sentInitial) { // Add the total message length writer.AddUInt32((uint)message.GetLength()); sentInitial = true; } // Sequence number sequenceNumber = GetNextSequenceNumber(); writer.AddUInt16(sequenceNumber); // Add the message fragment writer.AddBytes(message.GetFragment(i)); // Get the final packet and send it! packet = writer.GetFinalSOEPacket(Client, true, true); Client.SendPacket(packet); } // Did any other thread add a fragmented packet? if (FragmentedQueue.Count > 0) { BusySendingFragmentedPacket = false; SendFragmentedMessage(FragmentedQueue.Dequeue()); } }
private void Acknowledge(ushort sequenceNumber) { // Setup a writer SOEWriter writer = new SOEWriter((ushort)SOEOPCodes.ACK_RELIABLE_DATA); // Compressed? (Always false) writer.AddBoolean(false); // Add the sequence number writer.AddUInt16(sequenceNumber); // Send the packet SOEPacket packet = writer.GetFinalSOEPacket(Client, true, true); Client.SendPacket(packet); }