Another tweak for CoD4x rcon parsing.

This commit is contained in:
RaidMax 2020-12-12 21:43:27 -06:00
parent 6648b75255
commit f03626c3ae

View File

@ -10,6 +10,7 @@ using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Serilog.Context; using Serilog.Context;
@ -141,7 +142,7 @@ namespace IW4MAdmin.Application.RCon
} }
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
{ {
DontFragment = true, DontFragment = false,
Ttl = 100, Ttl = 100,
ExclusiveAddressUse = true, ExclusiveAddressUse = true,
}) })
@ -403,6 +404,7 @@ namespace IW4MAdmin.Application.RCon
// this occurs when we close the socket // this occurs when we close the socket
if (e.BytesTransferred == 0) if (e.BytesTransferred == 0)
{ {
_log.LogDebug("No bytes were transmitted so the connection was probably closed");
ActiveQueries[this.Endpoint].OnReceivedData.Set(); ActiveQueries[this.Endpoint].OnReceivedData.Set();
return; return;
} }
@ -415,16 +417,24 @@ namespace IW4MAdmin.Application.RCon
var state = ActiveQueries[this.Endpoint]; var state = ActiveQueries[this.Endpoint];
state.BytesReadPerSegment.Add(e.BytesTransferred); state.BytesReadPerSegment.Add(e.BytesTransferred);
// I don't even want to know why this works for getting more data from Cod4x
// but I'm leaving it in here as long as it doesn't break anything.
// it's very stupid...
Thread.Sleep(150);
try try
{ {
var totalBytesTransferred = e.BytesTransferred; var totalBytesTransferred = e.BytesTransferred;
_log.LogDebug("{total} total bytes transferred with {available} bytes remaining", totalBytesTransferred, sock.Available);
// we still have available data so the payload was segmented // we still have available data so the payload was segmented
while (sock.Available > 0) while (sock.Available > 0)
{ {
_log.LogDebug("{available} more bytes to be read", sock.Available);
state.ReceiveEventArgs.SetBuffer(state.ReceiveBuffer, totalBytesTransferred, sock.Available); state.ReceiveEventArgs.SetBuffer(state.ReceiveBuffer, totalBytesTransferred, sock.Available);
if (sock.ReceiveAsync(state.ReceiveEventArgs)) if (sock.ReceiveAsync(state.ReceiveEventArgs))
{ {
_log.LogDebug("Remaining bytes are async");
continue; continue;
} }
@ -439,6 +449,7 @@ namespace IW4MAdmin.Application.RCon
catch (ObjectDisposedException) catch (ObjectDisposedException)
{ {
_log.LogDebug("Socket was disposed while receiving data");
ActiveQueries[this.Endpoint].OnReceivedData.Set(); ActiveQueries[this.Endpoint].OnReceivedData.Set();
} }
} }