1
0
mirror of https://github.com/lidgren/lidgren-network-gen3.git synced 2026-05-17 07:36:32 +09:00

NetIncomingMessage.Clone added

Attempt to handle connection reset correctly when sending
This commit is contained in:
lidgren
2010-06-09 06:12:06 +00:00
parent 4e3aa68195
commit caf68daab7
8 changed files with 158 additions and 24 deletions

View File

@@ -37,8 +37,10 @@ namespace Lidgren.Network
public IPEndPoint Target;
}
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages)
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages, out bool connectionReset)
{
connectionReset = false;
// simulate loss
float loss = m_configuration.m_loss;
if (loss > 0.0f)
@@ -59,7 +61,7 @@ namespace Lidgren.Network
{
// no latency simulation
//LogVerbose("Sending packet " + numBytes + " bytes");
ActuallySendPacket(m_sendBuffer, numBytes, target);
ActuallySendPacket(m_sendBuffer, numBytes, target, out connectionReset);
return;
}
@@ -92,26 +94,39 @@ namespace Lidgren.Network
double now = NetTime.Now;
bool connectionReset;
RestartDelaySending:
foreach (DelayedPacket p in m_delayedPackets)
{
if (now > p.DelayedUntil)
{
ActuallySendPacket(p.Data, p.Data.Length, p.Target);
ActuallySendPacket(p.Data, p.Data.Length, p.Target, out connectionReset);
m_delayedPackets.Remove(p);
goto RestartDelaySending;
}
}
}
internal void ActuallySendPacket(byte[] data, int numBytes, IPEndPoint target)
internal void ActuallySendPacket(byte[] data, int numBytes, IPEndPoint target, out bool connectionReset)
{
connectionReset = false;
try
{
int bytesSent = m_socket.SendTo(data, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.ConnectionReset)
{
// connection reset by peer, aka connection forcibly closed aka "ICMP port unreachable"
connectionReset = true;
return;
}
LogError("Failed to send packet: " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);
@@ -122,7 +137,7 @@ namespace Lidgren.Network
//
// Release - just send the packet straight away
//
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages)
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages, out bool connectionReset)
{
try
{
@@ -130,6 +145,16 @@ namespace Lidgren.Network
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.ConnectionReset)
{
// connection reset by peer, aka connection forcibly closed aka "ICMP port unreachable"
connectionReset = true;
return;
}
LogError("Failed to send packet: " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);