@@ -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 {
@@ -379,9 +401,9 @@ private void ListenerThread()
379401 udpClient . Close ( ) ;
380402 }
381403 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 ) ;
404+ }
405+ tcpHandler = new TCPHandler ( LocalIPAddress , port ) ;
406+ if ( debug ) StoreLogData . Instance . Store ( $ "EasyModbus Server listing for incomming data at Port { port } , local IP { LocalIPAddress } " , System . DateTime . Now ) ;
385407 tcpHandler . dataChanged += new TCPHandler . DataChanged ( ProcessReceivedData ) ;
386408 tcpHandler . numberOfClientsChanged += new TCPHandler . NumberOfClientsChanged ( numberOfClientsChanged ) ;
387409 }
@@ -408,8 +430,9 @@ private void ListenerThread()
408430 {
409431 if ( udpClient == null | PortChanged )
410432 {
411- udpClient = new UdpClient ( port ) ;
412- if ( debug ) StoreLogData . Instance . Store ( "EasyModbus Server listing for incomming data at Port " + port , System . DateTime . Now ) ;
433+ IPEndPoint localEndoint = new IPEndPoint ( LocalIPAddress , port ) ;
434+ udpClient = new UdpClient ( localEndoint ) ;
435+ if ( debug ) StoreLogData . Instance . Store ( $ "EasyModbus Server listing for incomming data at Port { port } , local IP { LocalIPAddress } ", System . DateTime . Now ) ;
413436 udpClient . Client . ReceiveTimeout = 1000 ;
414437 iPEndPoint = new IPEndPoint ( IPAddress . Any , port ) ;
415438 PortChanged = false ;
0 commit comments