Skip to content

Switches connections to attempt to connect to IP addresses in parallel #75

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions src/FRC.NetworkTables/Dispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using NetworkTables.Interfaces;
using NetworkTables.TcpSockets;
using NetworkTables.Logging;
using System;

namespace NetworkTables
{
Expand Down Expand Up @@ -45,22 +46,23 @@ public void StartServer(string persistentFilename, string listenAddress, int por

public void SetServer(string serverName, int port)
{
SetConnector(() => TcpConnector.Connect(serverName, port, Logger.Instance, 1));
SetConnector(() => TcpConnector.Connect(new List<(string server, int port)> { (serverName, port) }, Logger.Instance, TimeSpan.FromSeconds(1)));
}

public void SetServer(IList<NtIPAddress> servers)
{
List<Connector> connectors = new List<Connector>();
List<(string server, int port)> addresses = new List<(string server, int port)>(servers.Count);
foreach (var server in servers)
{
connectors.Add(() => TcpConnector.Connect(server.IpAddress, server.Port, Logger.Instance, 1));
addresses.Add(server);
}
SetConnector(connectors);

SetConnector(() => TcpConnector.Connect(addresses, Logger.Instance, TimeSpan.FromSeconds(1)));
}

public void SetServerOverride(IPAddress address, int port)
{
SetConnectorOverride(() => TcpConnector.Connect(address.ToString(), port, Logger.Instance, 1));
SetConnectorOverride(() => TcpConnector.Connect(new List<(string server, int port)> { (address.ToString(), port) }, Logger.Instance, TimeSpan.FromSeconds(1)));
}

public void ClearServerOverride()
Expand Down
28 changes: 7 additions & 21 deletions src/FRC.NetworkTables/DispatcherBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@
using System.Threading.Tasks;
using Nito.AsyncEx.Synchronous;
using NetworkTables.Logging;
using System.Net.Sockets;

namespace NetworkTables
{
internal class DispatcherBase : IDisposable
{
public delegate NtTcpClient Connector();
public delegate TcpClient Connector();

public const double MinimumUpdateTime = 0.01; //100ms
public const double MaximumUpdateTime = 1.0; //1 second
Expand All @@ -38,7 +39,7 @@ internal class DispatcherBase : IDisposable
private bool m_doReconnect = true;
private string m_identity = "";

private IList<Connector> m_clientConnectors = new List<Connector>();
private Connector m_clientConnector;

private DateTime m_lastFlush;

Expand Down Expand Up @@ -153,15 +154,10 @@ public void StartClient()
}

public void SetConnector(Connector connector)
{
SetConnector(new List<Connector>() { connector });
}

public void SetConnector(IList<Connector> connectors)
{
lock (m_userMutex)
{
m_clientConnectors = connectors;
m_clientConnector = connector;
}
}

Expand Down Expand Up @@ -191,7 +187,7 @@ public void Stop()
//Wake up client thread with a reconnect
lock (m_userMutex)
{
m_clientConnectors.Clear();
m_clientConnector = null;
}
ClientReconnect();

Expand Down Expand Up @@ -360,7 +356,7 @@ private void ServerThreadMain()
}
if (!m_active) return;

if (stream.RemoteEndPoint is IPEndPoint ipEp)
if (stream.Client.RemoteEndPoint is IPEndPoint ipEp)
{
Debug(Logger.Instance, $"server: client connection from {ipEp.Address} port {ipEp.Port.ToString()}");
}
Expand Down Expand Up @@ -397,7 +393,6 @@ private void ServerThreadMain()

private void ClientThreadMain()
{
int i = 0;
while (m_active)
{
//Sleep between retries
Expand All @@ -407,16 +402,7 @@ private void ClientThreadMain()

lock (m_userMutex)
{
if (m_clientConnectorOverride != null)
{
connect = m_clientConnectorOverride;
}
else
{
if (m_clientConnectors.Count == 0) continue;
if (i >= m_clientConnectors.Count) i = 0;
connect = m_clientConnectors[i++];
}
connect = m_clientConnectorOverride ?? m_clientConnector;
}

Debug(Logger.Instance, "client trying to connect");
Expand Down
8 changes: 4 additions & 4 deletions src/FRC.NetworkTables/NetworkConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
using System.Threading;
using NetworkTables.Streams;
using NetworkTables.Support;
using NetworkTables.TcpSockets;
using NetworkTables.Wire;
using static NetworkTables.Logging.Logger;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Nito.AsyncEx.Synchronous;
using NetworkTables.Logging;
using System.Net.Sockets;

namespace NetworkTables
{
Expand All @@ -32,7 +32,7 @@ public enum State { Created, Init, Handshake, Synchronized, Active, Dead };
private readonly Stream m_stream;

// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
private readonly IClient m_client;
private readonly TcpClient m_client;

public int PeerPort { get; }
public string PeerIP { get; }
Expand Down Expand Up @@ -64,7 +64,7 @@ public enum State { Created, Init, Handshake, Synchronized, Active, Dead };

private readonly List<(int First, int Second)> m_pendingUpdate = new List<(int First, int Second)>();

public NetworkConnection(IClient client, Notifier notifier, HandshakeFunc handshake,
public NetworkConnection(TcpClient client, Notifier notifier, HandshakeFunc handshake,
Message.GetEntryTypeFunc getEntryType)
{
Uid = (uint)Interlocked.Increment(ref s_uid) - 1;
Expand All @@ -79,7 +79,7 @@ public NetworkConnection(IClient client, Notifier notifier, HandshakeFunc handsh
m_state = State.Created;
LastUpdate = 0;

if (m_client.RemoteEndPoint is IPEndPoint ipEp)
if (m_client.Client.RemoteEndPoint is IPEndPoint ipEp)
{
PeerIP = ipEp.Address.ToString();
PeerPort = ipEp.Port;
Expand Down
13 changes: 0 additions & 13 deletions src/FRC.NetworkTables/TcpSockets/IClient.cs

This file was deleted.

3 changes: 2 additions & 1 deletion src/FRC.NetworkTables/TcpSockets/INetworkAcceptor.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System;
using System.Net.Sockets;

namespace NetworkTables.TcpSockets
{
internal interface INetworkAcceptor: IDisposable
{
int Start();
void Shutdown();
IClient Accept();
TcpClient Accept();
}
}
Loading