@@ -85,27 +85,40 @@ internal class TCPHandler
85
85
public event NumberOfClientsChanged numberOfClientsChanged ;
86
86
87
87
TcpListener server = null ;
88
-
88
+
89
89
90
90
private List < Client > tcpClientLastRequestList = new List < Client > ( ) ;
91
91
92
92
public int NumberOfConnectedClients { get ; set ; }
93
93
94
94
public string ipAddress = null ;
95
95
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>
96
106
public TCPHandler ( int port )
97
107
{
98
- IPAddress localAddr = IPAddress . Any ;
99
- server = new TcpListener ( localAddr , port ) ;
108
+ server = new TcpListener ( LocalIPAddress , port ) ;
100
109
server . Start ( ) ;
101
110
server . BeginAcceptTcpClient ( AcceptTcpClientCallback , null ) ;
102
111
}
103
112
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 )
105
119
{
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 ) ;
109
122
server . Start ( ) ;
110
123
server . BeginAcceptTcpClient ( AcceptTcpClientCallback , null ) ;
111
124
}
@@ -311,8 +324,17 @@ public class ModbusServer
311
324
object lockCoils = new object ( ) ;
312
325
object lockHoldingRegisters = new object ( ) ;
313
326
private volatile bool shouldStop ;
314
-
315
327
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
+ }
316
338
317
339
public ModbusServer ( )
318
340
{
@@ -326,15 +348,23 @@ public ModbusServer()
326
348
#region events
327
349
public delegate void CoilsChangedHandler ( int coil , int numberOfCoils ) ;
328
350
public event CoilsChangedHandler CoilsChanged ;
351
+ public delegate void CoilsChangedWithServerHandler ( ModbusServer server , int coil , int numberOfCoils ) ;
352
+ public event CoilsChangedWithServerHandler CoilsChangedWithServer ;
329
353
330
354
public delegate void HoldingRegistersChangedHandler ( int register , int numberOfRegisters ) ;
331
355
public event HoldingRegistersChangedHandler HoldingRegistersChanged ;
356
+ public delegate void HoldingRegistersChangedWithServerHandler ( ModbusServer server , int register , int numberOfRegisters ) ;
357
+ public event HoldingRegistersChangedWithServerHandler HoldingRegistersChangedWithServer ;
332
358
333
359
public delegate void NumberOfConnectedClientsChangedHandler ( ) ;
334
360
public event NumberOfConnectedClientsChangedHandler NumberOfConnectedClientsChanged ;
361
+ public delegate void NumberOfConnectedClientsChangedWithServerHandler ( ModbusServer server ) ;
362
+ public event NumberOfConnectedClientsChangedWithServerHandler NumberOfConnectedClientsChangedWithServer ;
335
363
336
364
public delegate void LogDataChangedHandler ( ) ;
337
365
public event LogDataChangedHandler LogDataChanged ;
366
+ public delegate void LogDataChangedWithServerHandler ( ModbusServer server ) ;
367
+ public event LogDataChangedWithServerHandler LogDataChangedWithServer ;
338
368
#endregion
339
369
340
370
public void Listen ( )
@@ -379,9 +409,9 @@ private void ListenerThread()
379
409
udpClient . Close ( ) ;
380
410
}
381
411
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 ) ;
385
415
tcpHandler . dataChanged += new TCPHandler . DataChanged ( ProcessReceivedData ) ;
386
416
tcpHandler . numberOfClientsChanged += new TCPHandler . NumberOfClientsChanged ( numberOfClientsChanged ) ;
387
417
}
@@ -408,8 +438,9 @@ private void ListenerThread()
408
438
{
409
439
if ( udpClient == null | PortChanged )
410
440
{
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 ) ;
413
444
udpClient . Client . ReceiveTimeout = 1000 ;
414
445
iPEndPoint = new IPEndPoint ( IPAddress . Any , port ) ;
415
446
PortChanged = false ;
@@ -485,6 +516,8 @@ private void numberOfClientsChanged()
485
516
numberOfConnections = tcpHandler . NumberOfConnectedClients ;
486
517
if ( NumberOfConnectedClientsChanged != null )
487
518
NumberOfConnectedClientsChanged ( ) ;
519
+ if ( NumberOfConnectedClientsChangedWithServer != null )
520
+ NumberOfConnectedClientsChangedWithServer ( this ) ;
488
521
}
489
522
#endregion
490
523
@@ -650,6 +683,8 @@ private void ProcessReceivedData(object networkConnectionParameter)
650
683
651
684
if ( LogDataChanged != null )
652
685
LogDataChanged ( ) ;
686
+ if ( LogDataChangedWithServer != null )
687
+ LogDataChangedWithServer ( this ) ;
653
688
}
654
689
}
655
690
#endregion
@@ -1390,6 +1425,8 @@ private void WriteSingleCoil(ModbusProtocol receiveData, ModbusProtocol sendData
1390
1425
catch ( Exception ) { }
1391
1426
if ( CoilsChanged != null )
1392
1427
CoilsChanged ( receiveData . startingAdress + 1 , 1 ) ;
1428
+ if ( CoilsChangedWithServer != null )
1429
+ CoilsChangedWithServer ( this , receiveData . startingAdress + 1 , 1 ) ;
1393
1430
}
1394
1431
}
1395
1432
@@ -1513,6 +1550,8 @@ private void WriteSingleRegister(ModbusProtocol receiveData, ModbusProtocol send
1513
1550
catch ( Exception ) { }
1514
1551
if ( HoldingRegistersChanged != null )
1515
1552
HoldingRegistersChanged ( receiveData . startingAdress + 1 , 1 ) ;
1553
+ if ( HoldingRegistersChangedWithServer != null )
1554
+ HoldingRegistersChangedWithServer ( this , receiveData . startingAdress + 1 , 1 ) ;
1516
1555
}
1517
1556
}
1518
1557
@@ -1653,6 +1692,8 @@ private void WriteMultipleCoils(ModbusProtocol receiveData, ModbusProtocol sendD
1653
1692
catch ( Exception ) { }
1654
1693
if ( CoilsChanged != null )
1655
1694
CoilsChanged ( receiveData . startingAdress + 1 , receiveData . quantity ) ;
1695
+ if ( CoilsChangedWithServer != null )
1696
+ CoilsChangedWithServer ( this , receiveData . startingAdress + 1 , receiveData . quantity ) ;
1656
1697
}
1657
1698
}
1658
1699
@@ -1777,6 +1818,8 @@ private void WriteMultipleRegisters(ModbusProtocol receiveData, ModbusProtocol s
1777
1818
catch ( Exception ) { }
1778
1819
if ( HoldingRegistersChanged != null )
1779
1820
HoldingRegistersChanged ( receiveData . startingAdress + 1 , receiveData . quantity ) ;
1821
+ if ( HoldingRegistersChangedWithServer != null )
1822
+ HoldingRegistersChangedWithServer ( this , receiveData . startingAdress + 1 , receiveData . quantity ) ;
1780
1823
}
1781
1824
}
1782
1825
@@ -1908,6 +1951,8 @@ private void ReadWriteMultipleRegisters(ModbusProtocol receiveData, ModbusProtoc
1908
1951
catch ( Exception ) { }
1909
1952
if ( HoldingRegistersChanged != null )
1910
1953
HoldingRegistersChanged ( receiveData . startingAddressWrite + 1 , receiveData . quantityWrite ) ;
1954
+ if ( HoldingRegistersChangedWithServer != null )
1955
+ HoldingRegistersChangedWithServer ( this , receiveData . startingAddressWrite + 1 , receiveData . quantityWrite ) ;
1911
1956
}
1912
1957
}
1913
1958
0 commit comments