internal void SendStart() { if (!Running || !_socket.Connected) { DisposeSendSystem(); return; } try { ByteQueue byteQueue = new ByteQueue(); int length = 0; while (!PacketsToBeSent.IsEmpty && length <= 1024) { Packet packet; if (!PacketsToBeSent.TryDequeue(out packet)) { Interlocked.Exchange(ref _timesEnqueuedForSend, 0); return; } if (!packet.Shared) packet.Write(); byte[] packetBuffer = packet.GetBuffer(); length += packetBuffer.Length; byteQueue.Enqueue(packetBuffer, 0, packetBuffer.Length); packet.Release(); } if (byteQueue.Length > 0) { byte[] data = new byte[length]; byteQueue.Dequeue(data, 0, data.Length); Send_Async(data); } else { Interlocked.Exchange(ref _timesEnqueuedForSend, 0); if (!PacketsToBeSent.IsEmpty) { int newValue = Interlocked.Increment(ref _timesEnqueuedForSend); if (newValue == 1) { Server.SendClientQueue.Enqueue(this); Server.NetworkSignal.Set(); } } } } catch (Exception) { MarkToDispose(); DisposeSendSystem(); //if (packet != null) //Logger.Log(LogLevel.Error, "Sending packet: {0}", packet.ToString()); //Logger.Log(LogLevel.Error, e.ToString()); // TODO: log something? } }
private static byte[] GetBufferToBeRead(ByteQueue processedBuffer, Client client, int length) { int availableData = client.FragPackets.Size + processedBuffer.Size; if (length > availableData) return null; int fromFrag; byte[] data = new byte[length]; if (length >= client.FragPackets.Size) fromFrag = client.FragPackets.Size; else fromFrag = length; client.FragPackets.Dequeue(data, 0, fromFrag); int fromProcessed = length - fromFrag; processedBuffer.Dequeue(data, fromFrag, fromProcessed); return data; }