Skip to content

Commit bd92e5c

Browse files
Merge pull request rossmann-engineering#50 from da66en/feature_server_specify_ip
Specify network interface for TCP and UDP servers
2 parents a68fd87 + d2fe6b4 commit bd92e5c

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

EasyModbus/ModbusServer.cs

Lines changed: 36 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
{
@@ -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

Comments
 (0)