@@ -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