Skip to content
Merged
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
49 changes: 36 additions & 13 deletions EasyModbus/ModbusServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,27 +85,40 @@ internal class TCPHandler
public event NumberOfClientsChanged numberOfClientsChanged;

TcpListener server = null;


private List<Client> tcpClientLastRequestList = new List<Client>();

public int NumberOfConnectedClients { get; set; }

public string ipAddress = null;

/// When making a server TCP listen socket, will listen to this IP address.
public IPAddress LocalIPAddress {
get { return localIPAddress; }
}
private IPAddress localIPAddress = IPAddress.Any;

/// <summary>
/// Listen to all network interfaces.
/// </summary>
/// <param name="port">TCP port to listen</param>
public TCPHandler(int port)
{
IPAddress localAddr = IPAddress.Any;
server = new TcpListener(localAddr, port);
server = new TcpListener(LocalIPAddress, port);
server.Start();
server.BeginAcceptTcpClient(AcceptTcpClientCallback, null);
}

public TCPHandler(string ipAddress, int port)
/// <summary>
/// Listen to a specific network interface.
/// </summary>
/// <param name="localIPAddress">IP address of network interface to listen</param>
/// <param name="port">TCP port to listen</param>
public TCPHandler(IPAddress localIPAddress, int port)
{
this.ipAddress = ipAddress;
IPAddress localAddr = IPAddress.Any;
server = new TcpListener(localAddr, port);
this.localIPAddress = localIPAddress;
server = new TcpListener(LocalIPAddress, port);
server.Start();
server.BeginAcceptTcpClient(AcceptTcpClientCallback, null);
}
Expand Down Expand Up @@ -311,8 +324,17 @@ public class ModbusServer
object lockCoils = new object();
object lockHoldingRegisters = new object();
private volatile bool shouldStop;


private IPAddress localIPAddress = IPAddress.Any;

/// <summary>
/// When creating a TCP or UDP socket, the local IP address to attach to.
/// </summary>
public IPAddress LocalIPAddress
{
get { return localIPAddress; }
set { if (listenerThread == null) localIPAddress = value; }
}

public ModbusServer()
{
Expand Down Expand Up @@ -379,9 +401,9 @@ private void ListenerThread()
udpClient.Close();
}
catch (Exception) { }
}
tcpHandler = new TCPHandler(port);
if (debug) StoreLogData.Instance.Store("EasyModbus Server listing for incomming data at Port " + port, System.DateTime.Now);
}
tcpHandler = new TCPHandler(LocalIPAddress, port);
if (debug) StoreLogData.Instance.Store($"EasyModbus Server listing for incomming data at Port {port}, local IP {LocalIPAddress}", System.DateTime.Now);
tcpHandler.dataChanged += new TCPHandler.DataChanged(ProcessReceivedData);
tcpHandler.numberOfClientsChanged += new TCPHandler.NumberOfClientsChanged(numberOfClientsChanged);
}
Expand All @@ -408,8 +430,9 @@ private void ListenerThread()
{
if (udpClient == null | PortChanged)
{
udpClient = new UdpClient(port);
if (debug) StoreLogData.Instance.Store("EasyModbus Server listing for incomming data at Port " + port, System.DateTime.Now);
IPEndPoint localEndoint = new IPEndPoint(LocalIPAddress, port);
udpClient = new UdpClient(localEndoint);
if (debug) StoreLogData.Instance.Store($"EasyModbus Server listing for incomming data at Port {port}, local IP {LocalIPAddress}", System.DateTime.Now);
udpClient.Client.ReceiveTimeout = 1000;
iPEndPoint = new IPEndPoint(IPAddress.Any, port);
PortChanged = false;
Expand Down