You've already forked lidgren-network-gen3
mirror of
https://github.com/lidgren/lidgren-network-gen3.git
synced 2026-05-16 15:16:33 +09:00
Deleted two more obsolete files
This commit is contained in:
@@ -1,309 +0,0 @@
|
||||
/* Copyright (c) 2010 Michael Lidgren
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||
and associated documentation files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
|
||||
namespace Lidgren.Network
|
||||
{
|
||||
public partial class NetConnection
|
||||
{
|
||||
private readonly int[] m_nextSendSequenceNumber;
|
||||
private readonly ushort[] m_lastReceivedSequenced;
|
||||
|
||||
internal readonly List<NetSending> m_unackedSends = new List<NetSending>();
|
||||
|
||||
//internal readonly Dictionary<ushort, NetOutgoingMessage>[] m_storedMessages = new Dictionary<ushort, NetOutgoingMessage>[NetConstants.NumReliableChannels];
|
||||
//internal readonly Dictionary<NetOutgoingMessage, ushort>[] m_inverseStored = new Dictionary<NetOutgoingMessage, ushort>[NetConstants.NumReliableChannels];
|
||||
internal readonly NetBitVector m_storedMessagesNotEmpty = new NetBitVector(NetConstants.NumReliableChannels);
|
||||
|
||||
private readonly ushort[] m_nextExpectedReliableSequence = new ushort[NetConstants.NumReliableChannels];
|
||||
private readonly List<NetIncomingMessage>[] m_withheldMessages = new List<NetIncomingMessage>[NetConstants.NetChannelsPerDeliveryMethod]; // only for ReliableOrdered
|
||||
internal readonly Queue<int> m_acknowledgesToSend = new Queue<int>();
|
||||
internal double m_nextForceAckTime;
|
||||
|
||||
private readonly NetBitVector[] m_reliableReceived = new NetBitVector[NetConstants.NumSequenceNumbers];
|
||||
|
||||
public int GetStoredMessagesCount()
|
||||
{
|
||||
return m_unackedSends.Count;
|
||||
}
|
||||
|
||||
public int GetWithheldMessagesCount()
|
||||
{
|
||||
int retval = 0;
|
||||
for (int i = 0; i < m_withheldMessages.Length; i++)
|
||||
{
|
||||
var list = m_withheldMessages[i];
|
||||
if (list != null)
|
||||
retval += list.Count;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
internal ushort GetSendSequenceNumber(NetMessageType mtp)
|
||||
{
|
||||
if (mtp < NetMessageType.UserSequenced)
|
||||
return 0;
|
||||
|
||||
int slot = (int)mtp - (int)NetMessageType.UserSequenced;
|
||||
int retval;
|
||||
lock (m_nextSendSequenceNumber)
|
||||
{
|
||||
retval = m_nextSendSequenceNumber[slot];
|
||||
if (retval == ushort.MaxValue)
|
||||
retval = -1;
|
||||
m_nextSendSequenceNumber[slot] = retval + 1;
|
||||
}
|
||||
return (ushort)retval;
|
||||
}
|
||||
|
||||
internal static int Relate(int seqNr, int lastReceived)
|
||||
{
|
||||
return (seqNr < lastReceived ? (seqNr + NetConstants.NumSequenceNumbers) - lastReceived : seqNr - lastReceived);
|
||||
}
|
||||
|
||||
// returns true if message should be rejected
|
||||
internal bool ReceivedSequencedMessage(NetMessageType mtp, ushort seqNr)
|
||||
{
|
||||
int slot = (int)mtp - (int)NetMessageType.UserSequenced;
|
||||
|
||||
int diff = Relate(seqNr, m_lastReceivedSequenced[slot]);
|
||||
|
||||
if (diff == 0)
|
||||
return true; // reject; already received
|
||||
if (diff > (ushort.MaxValue / 2))
|
||||
return true; // reject; out of window
|
||||
|
||||
m_lastReceivedSequenced[slot] = seqNr;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
// called by Encode() to retrieve a sequence number and store the message for potential resending
|
||||
internal ushort StoreReliableMessage(double now, NetOutgoingMessage msg)
|
||||
{
|
||||
m_owner.VerifyNetworkThread();
|
||||
|
||||
int seqNr = -1;
|
||||
|
||||
int reliableSlot = (int)msg.m_type - (int)NetMessageType.UserReliableUnordered;
|
||||
Dictionary<ushort, NetOutgoingMessage> slotDict = m_storedMessages[reliableSlot];
|
||||
Dictionary<NetOutgoingMessage, ushort> invSlotDict = m_inverseStored[reliableSlot];
|
||||
if (slotDict == null)
|
||||
{
|
||||
slotDict = new Dictionary<ushort, NetOutgoingMessage>();
|
||||
m_storedMessages[reliableSlot] = slotDict;
|
||||
|
||||
invSlotDict = new Dictionary<NetOutgoingMessage, ushort>();
|
||||
m_inverseStored[reliableSlot] = invSlotDict;
|
||||
|
||||
// (cannot be a resend here)
|
||||
}
|
||||
else
|
||||
{
|
||||
// we assume there's a invSlotDict if there's a slotDict
|
||||
// is it a resend? if so, return the old sequence number
|
||||
ushort oldSeqNr;
|
||||
if (invSlotDict.TryGetValue(msg, out oldSeqNr))
|
||||
seqNr = oldSeqNr;
|
||||
}
|
||||
|
||||
if (seqNr != -1)
|
||||
{
|
||||
// resend!
|
||||
// m_owner.LogDebug("Resending " + msg.m_type + "|" + seqNr);
|
||||
m_statistics.MessageResent();
|
||||
}
|
||||
else
|
||||
{
|
||||
// first send
|
||||
seqNr = GetSendSequenceNumber(msg.m_type);
|
||||
|
||||
//m_owner.LogDebug("Sending " + msg.m_type + "|" + seqNr);
|
||||
|
||||
Interlocked.Increment(ref msg.m_inQueueCount);
|
||||
slotDict.Add((ushort)seqNr, msg);
|
||||
invSlotDict.Add(msg, (ushort)seqNr);
|
||||
|
||||
if (slotDict.Count > 0)
|
||||
m_storedMessagesNotEmpty.Set(reliableSlot, true);
|
||||
}
|
||||
|
||||
// schedule next resend
|
||||
int numSends = msg.m_numSends;
|
||||
float[] baseTimes = m_peerConfiguration.m_resendBaseTime;
|
||||
float[] multiplers = m_peerConfiguration.m_resendRTTMultiplier;
|
||||
if (numSends >= baseTimes.Length)
|
||||
numSends = baseTimes.Length - 1;
|
||||
msg.m_nextResendTime = now + baseTimes[numSends] + (m_averageRoundtripTime * multiplers[numSends]);
|
||||
|
||||
return (ushort)seqNr;
|
||||
}
|
||||
*/
|
||||
|
||||
private void HandleIncomingAcks(int ptr, int payloadByteLength)
|
||||
{
|
||||
m_owner.VerifyNetworkThread();
|
||||
|
||||
int numAcks = payloadByteLength / 3;
|
||||
if (numAcks * 3 != payloadByteLength)
|
||||
m_owner.LogWarning("Malformed ack message; payload length is " + payloadByteLength);
|
||||
|
||||
byte[] buffer = m_owner.m_receiveBuffer;
|
||||
for (int i = 0; i < numAcks; i++)
|
||||
{
|
||||
ushort seqNr = (ushort)(buffer[ptr++] | (buffer[ptr++] << 8));
|
||||
NetMessageType tp = (NetMessageType)buffer[ptr++];
|
||||
//m_owner.LogDebug("Got ack for " + tp + "|" + seqNr);
|
||||
|
||||
foreach(NetSending send in m_unackedSends)
|
||||
{
|
||||
if (send.MessageType == tp && send.SequenceNumber == seqNr)
|
||||
{
|
||||
// found it
|
||||
m_lastSendRespondedTo = NetTime.Now; // TODO: calculate from send.NextResend and send.NumSends
|
||||
int unfin = send.Message.m_numUnfinishedSendings;
|
||||
send.Message.m_numUnfinishedSendings = unfin - 1;
|
||||
if (unfin <= 0)
|
||||
m_owner.Recycle(send.Message); // every sent has been acked; free the message
|
||||
|
||||
m_owner.LogVerbose("Received ack for " + tp + "#" + seqNr);
|
||||
|
||||
m_unackedSends.Remove(send);
|
||||
|
||||
// TODO: recycle send
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// remove stored message
|
||||
int reliableSlot = (int)tp - (int)NetMessageType.UserReliableUnordered;
|
||||
|
||||
var dict = m_storedMessages[reliableSlot];
|
||||
if (dict == null)
|
||||
continue;
|
||||
|
||||
// find message
|
||||
NetOutgoingMessage om;
|
||||
if (dict.TryGetValue(seqNr, out om))
|
||||
{
|
||||
// found!
|
||||
dict.Remove(seqNr);
|
||||
m_inverseStored[reliableSlot].Remove(om);
|
||||
|
||||
if (dict.Count < 1)
|
||||
m_storedMessagesNotEmpty[reliableSlot] = false;
|
||||
|
||||
Interlocked.Decrement(ref om.m_inQueueCount);
|
||||
|
||||
NetException.Assert(om.m_lastSentTime != 0);
|
||||
|
||||
if (om.m_lastSentTime > m_lastSendRespondedTo)
|
||||
m_lastSendRespondedTo = om.m_lastSentTime;
|
||||
|
||||
if (om.m_inQueueCount < 1)
|
||||
m_owner.Recycle(om);
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: receipt handling
|
||||
}
|
||||
}
|
||||
|
||||
private void ExpectedReliableSequenceArrived(int reliableSlot, bool isFragment)
|
||||
{
|
||||
NetBitVector received = m_reliableReceived[reliableSlot];
|
||||
|
||||
int nextExpected = m_nextExpectedReliableSequence[reliableSlot];
|
||||
|
||||
if (received == null)
|
||||
{
|
||||
nextExpected = (nextExpected + 1) % NetConstants.NumSequenceNumbers;
|
||||
m_nextExpectedReliableSequence[reliableSlot] = (ushort)nextExpected;
|
||||
return;
|
||||
}
|
||||
|
||||
received[(nextExpected + (NetConstants.NumSequenceNumbers / 2)) % NetConstants.NumSequenceNumbers] = false; // reset for next pass
|
||||
nextExpected = (nextExpected + 1) % NetConstants.NumSequenceNumbers;
|
||||
|
||||
//
|
||||
// Release withheld messages
|
||||
//
|
||||
|
||||
while (received[nextExpected] == true)
|
||||
{
|
||||
// it seems we've already received the next expected reliable sequence number
|
||||
|
||||
// ordered?
|
||||
const int orderedSlotsStart = ((int)NetMessageType.UserReliableOrdered - (int)NetMessageType.UserReliableUnordered);
|
||||
if (reliableSlot >= orderedSlotsStart)
|
||||
{
|
||||
// ... then we should have a withheld message waiting
|
||||
|
||||
// this should be a withheld message
|
||||
int orderedSlot = reliableSlot - orderedSlotsStart;
|
||||
bool foundWithheld = false;
|
||||
|
||||
List<NetIncomingMessage> withheldList = m_withheldMessages[orderedSlot];
|
||||
if (withheldList != null)
|
||||
{
|
||||
foreach (NetIncomingMessage wm in withheldList)
|
||||
{
|
||||
int wmSeqChan = wm.SequenceChannel;
|
||||
|
||||
if (orderedSlot == wmSeqChan && wm.m_sequenceNumber == nextExpected)
|
||||
{
|
||||
// Found withheld message due for delivery
|
||||
m_owner.LogVerbose("Releasing withheld message " + wm);
|
||||
|
||||
//Console.WriteLine("Releasing withheld message " + wm);
|
||||
|
||||
// Accept, unless a fragment
|
||||
if (wm.m_fragmentationInfo == null)
|
||||
m_owner.ReleaseMessage(wm);
|
||||
|
||||
foundWithheld = true;
|
||||
withheldList.Remove(wm);
|
||||
|
||||
// advance next expected
|
||||
received[(nextExpected + (NetConstants.NumSequenceNumbers / 2)) % NetConstants.NumSequenceNumbers] = false; // reset for next pass
|
||||
nextExpected = (nextExpected + 1) % NetConstants.NumSequenceNumbers;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!foundWithheld)
|
||||
{
|
||||
// probably a fragment; we don't withhold those - advance anyway
|
||||
//Console.WriteLine("Withheld #" + nextExpected + " not found; probably a fragment!");
|
||||
//received[(nextExpected + (NetConstants.NumSequenceNumbers / 2)) % NetConstants.NumSequenceNumbers] = false; // reset for next pass
|
||||
//nextExpected = (nextExpected + 1) % NetConstants.NumSequenceNumbers;
|
||||
throw new NetException("Withheld message not found!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_nextExpectedReliableSequence[reliableSlot] = (ushort)nextExpected;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
/* Copyright (c) 2010 Michael Lidgren
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||
and associated documentation files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
|
||||
the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace Lidgren.Network
|
||||
{
|
||||
internal enum PendingConnectionStatus
|
||||
{
|
||||
NotPending = 0,
|
||||
Pending,
|
||||
Approved,
|
||||
Denied,
|
||||
}
|
||||
|
||||
public partial class NetPeer
|
||||
{
|
||||
private List<NetConnection> m_pendingConnections;
|
||||
|
||||
private void AddPendingConnection(NetConnection conn, NetIncomingMessage approval)
|
||||
{
|
||||
if (m_pendingConnections == null)
|
||||
m_pendingConnections = new List<NetConnection>();
|
||||
m_pendingConnections.Add(conn);
|
||||
conn.m_pendingStatus = PendingConnectionStatus.Pending;
|
||||
|
||||
if (approval == null)
|
||||
approval = CreateIncomingMessage(NetIncomingMessageType.ConnectionApproval, 0);
|
||||
approval.m_messageType = NetMessageType.Library;
|
||||
approval.m_senderConnection = conn;
|
||||
approval.m_senderEndpoint = conn.m_remoteEndpoint;
|
||||
|
||||
ReleaseMessage(approval);
|
||||
}
|
||||
|
||||
private void CheckPendingConnections()
|
||||
{
|
||||
if (m_pendingConnections == null || m_pendingConnections.Count < 1)
|
||||
return;
|
||||
|
||||
foreach (NetConnection conn in m_pendingConnections)
|
||||
{
|
||||
switch (conn.m_pendingStatus)
|
||||
{
|
||||
case PendingConnectionStatus.Pending:
|
||||
if (NetTime.Now > conn.m_connectInitationTime + 10.0)
|
||||
{
|
||||
LogWarning("Pending connection still in pending state after 10 seconds; forgot to Approve/Deny?");
|
||||
m_pendingConnections.Remove(conn);
|
||||
if (m_pendingConnections.Count < 1)
|
||||
m_pendingConnections = null;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case PendingConnectionStatus.Approved:
|
||||
// accept connection
|
||||
AcceptConnection(conn);
|
||||
m_pendingConnections.Remove(conn);
|
||||
if (m_pendingConnections.Count < 1)
|
||||
m_pendingConnections = null;
|
||||
return;
|
||||
case PendingConnectionStatus.Denied:
|
||||
// send disconnected
|
||||
NetOutgoingMessage bye = CreateLibraryMessage(NetMessageLibraryType.Disconnect, conn.m_pendingDenialReason);
|
||||
SendUnconnectedLibrary(bye, conn.m_remoteEndpoint);
|
||||
m_pendingConnections.Remove(conn);
|
||||
if (m_pendingConnections.Count < 1)
|
||||
m_pendingConnections = null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user