Skip to content

Commit b638cd7

Browse files
committed
When creating TCP and UDP servers, you can specify which network interface to use.
Added new event delegates to ModbusServer class that pass a reference to the server to the event.
1 parent a68fd87 commit b638cd7

File tree

1 file changed

+58
-13
lines changed

1 file changed

+58
-13
lines changed

EasyModbus/ModbusServer.cs

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,40 @@ internal class TCPHandler
8585
public event NumberOfClientsChanged numberOfClientsChanged;
8686

8787
TcpListener server = null;
88-
88+
8989

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

9292
public int NumberOfConnectedClients { get; set; }
9393

9494
public string ipAddress = null;
9595

96+
/// When making a server TCP listen socket, will listen to this IP address.
97+
public IPAddress LocalIPAddress {
98+
get { return localIPAddress; }
99+
}
100+
private IPAddress localIPAddress = IPAddress.Any;
101+
102+
/// <summary>
103+
/// Listen to all network interfaces.
104+
/// </summary>
105+
/// <param name="port">TCP port to listen</param>
96106
public TCPHandler(int port)
97107
{
98-
IPAddress localAddr = IPAddress.Any;
99-
server = new TcpListener(localAddr, port);
108+
server = new TcpListener(LocalIPAddress, port);
100109
server.Start();
101110
server.BeginAcceptTcpClient(AcceptTcpClientCallback, null);
102111
}
103112

104-
public TCPHandler(string ipAddress, int port)
113+
/// <summary>
114+
/// Listen to a specific network interface.
115+
/// </summary>
116+
/// <param name="localIPAddress">IP address of network interface to listen</param>
117+
/// <param name="port">TCP port to listen</param>
118+
public TCPHandler(IPAddress localIPAddress, int port)
105119
{
106-
this.ipAddress = ipAddress;
107-
IPAddress localAddr = IPAddress.Any;
108-
server = new TcpListener(localAddr, port);
120+
this.localIPAddress = localIPAddress;
121+
server = new TcpListener(LocalIPAddress, port);
109122
server.Start();
110123
server.BeginAcceptTcpClient(AcceptTcpClientCallback, null);
111124
}
@@ -311,8 +324,17 @@ public class ModbusServer
311324
object lockCoils = new object();
312325
object lockHoldingRegisters = new object();
313326
private volatile bool shouldStop;
314-
315327

328+
private IPAddress localIPAddress = IPAddress.Any;
329+
330+
/// <summary>
331+
/// When creating a TCP or UDP socket, the local IP address to attach to.
332+
/// </summary>
333+
public IPAddress LocalIPAddress
334+
{
335+
get { return localIPAddress; }
336+
set { if (listenerThread == null) localIPAddress = value; }
337+
}
316338

317339
public ModbusServer()
318340
{
@@ -326,15 +348,23 @@ public ModbusServer()
326348
#region events
327349
public delegate void CoilsChangedHandler(int coil, int numberOfCoils);
328350
public event CoilsChangedHandler CoilsChanged;
351+
public delegate void CoilsChangedWithServerHandler(ModbusServer server, int coil, int numberOfCoils);
352+
public event CoilsChangedWithServerHandler CoilsChangedWithServer;
329353

330354
public delegate void HoldingRegistersChangedHandler(int register, int numberOfRegisters);
331355
public event HoldingRegistersChangedHandler HoldingRegistersChanged;
356+
public delegate void HoldingRegistersChangedWithServerHandler(ModbusServer server, int register, int numberOfRegisters);
357+
public event HoldingRegistersChangedWithServerHandler HoldingRegistersChangedWithServer;
332358

333359
public delegate void NumberOfConnectedClientsChangedHandler();
334360
public event NumberOfConnectedClientsChangedHandler NumberOfConnectedClientsChanged;
361+
public delegate void NumberOfConnectedClientsChangedWithServerHandler(ModbusServer server);
362+
public event NumberOfConnectedClientsChangedWithServerHandler NumberOfConnectedClientsChangedWithServer;
335363

336364
public delegate void LogDataChangedHandler();
337365
public event LogDataChangedHandler LogDataChanged;
366+
public delegate void LogDataChangedWithServerHandler(ModbusServer server);
367+
public event LogDataChangedWithServerHandler LogDataChangedWithServer;
338368
#endregion
339369

340370
public void Listen()
@@ -379,9 +409,9 @@ private void ListenerThread()
379409
udpClient.Close();
380410
}
381411
catch (Exception) { }
382-
}
383-
tcpHandler = new TCPHandler(port);
384-
if (debug) StoreLogData.Instance.Store("EasyModbus Server listing for incomming data at Port " + port, System.DateTime.Now);
412+
}
413+
tcpHandler = new TCPHandler(LocalIPAddress, port);
414+
if (debug) StoreLogData.Instance.Store($"EasyModbus Server listing for incomming data at Port {port}, local IP {LocalIPAddress}", System.DateTime.Now);
385415
tcpHandler.dataChanged += new TCPHandler.DataChanged(ProcessReceivedData);
386416
tcpHandler.numberOfClientsChanged += new TCPHandler.NumberOfClientsChanged(numberOfClientsChanged);
387417
}
@@ -408,8 +438,9 @@ private void ListenerThread()
408438
{
409439
if (udpClient == null | PortChanged)
410440
{
411-
udpClient = new UdpClient(port);
412-
if (debug) StoreLogData.Instance.Store("EasyModbus Server listing for incomming data at Port " + port, System.DateTime.Now);
441+
IPEndPoint localEndoint = new IPEndPoint(LocalIPAddress, port);
442+
udpClient = new UdpClient(localEndoint);
443+
if (debug) StoreLogData.Instance.Store($"EasyModbus Server listing for incomming data at Port {port}, local IP {LocalIPAddress}", System.DateTime.Now);
413444
udpClient.Client.ReceiveTimeout = 1000;
414445
iPEndPoint = new IPEndPoint(IPAddress.Any, port);
415446
PortChanged = false;
@@ -485,6 +516,8 @@ private void numberOfClientsChanged()
485516
numberOfConnections = tcpHandler.NumberOfConnectedClients;
486517
if (NumberOfConnectedClientsChanged != null)
487518
NumberOfConnectedClientsChanged();
519+
if (NumberOfConnectedClientsChangedWithServer != null)
520+
NumberOfConnectedClientsChangedWithServer(this);
488521
}
489522
#endregion
490523

@@ -650,6 +683,8 @@ private void ProcessReceivedData(object networkConnectionParameter)
650683

651684
if (LogDataChanged != null)
652685
LogDataChanged();
686+
if (LogDataChangedWithServer != null)
687+
LogDataChangedWithServer(this);
653688
}
654689
}
655690
#endregion
@@ -1390,6 +1425,8 @@ private void WriteSingleCoil(ModbusProtocol receiveData, ModbusProtocol sendData
13901425
catch (Exception) { }
13911426
if (CoilsChanged != null)
13921427
CoilsChanged(receiveData.startingAdress+1, 1);
1428+
if (CoilsChangedWithServer != null)
1429+
CoilsChangedWithServer(this, receiveData.startingAdress + 1, 1);
13931430
}
13941431
}
13951432

@@ -1513,6 +1550,8 @@ private void WriteSingleRegister(ModbusProtocol receiveData, ModbusProtocol send
15131550
catch (Exception) { }
15141551
if (HoldingRegistersChanged != null)
15151552
HoldingRegistersChanged(receiveData.startingAdress+1, 1);
1553+
if (HoldingRegistersChangedWithServer != null)
1554+
HoldingRegistersChangedWithServer(this, receiveData.startingAdress + 1, 1);
15161555
}
15171556
}
15181557

@@ -1653,6 +1692,8 @@ private void WriteMultipleCoils(ModbusProtocol receiveData, ModbusProtocol sendD
16531692
catch (Exception) { }
16541693
if (CoilsChanged != null)
16551694
CoilsChanged(receiveData.startingAdress+1, receiveData.quantity);
1695+
if (CoilsChangedWithServer != null)
1696+
CoilsChangedWithServer(this, receiveData.startingAdress + 1, receiveData.quantity);
16561697
}
16571698
}
16581699

@@ -1777,6 +1818,8 @@ private void WriteMultipleRegisters(ModbusProtocol receiveData, ModbusProtocol s
17771818
catch (Exception) { }
17781819
if (HoldingRegistersChanged != null)
17791820
HoldingRegistersChanged(receiveData.startingAdress+1, receiveData.quantity);
1821+
if (HoldingRegistersChangedWithServer != null)
1822+
HoldingRegistersChangedWithServer(this, receiveData.startingAdress + 1, receiveData.quantity);
17801823
}
17811824
}
17821825

@@ -1908,6 +1951,8 @@ private void ReadWriteMultipleRegisters(ModbusProtocol receiveData, ModbusProtoc
19081951
catch (Exception) { }
19091952
if (HoldingRegistersChanged != null)
19101953
HoldingRegistersChanged(receiveData.startingAddressWrite+1, receiveData.quantityWrite);
1954+
if (HoldingRegistersChangedWithServer != null)
1955+
HoldingRegistersChangedWithServer(this, receiveData.startingAddressWrite + 1, receiveData.quantityWrite);
19111956
}
19121957
}
19131958

0 commit comments

Comments
 (0)