TCP Server
One or more outstation instances may be bound to a TCP server using an AddressFilter. Unlike most server protocols, each outstation instance may only
communicate with a single client at a time. This is because DNP3 is stateful and maintains event data for a particular master. If you need to support more than
one master connection on the same port, you must preconfigure each master IP address and associate it with a particular outstation.
Creating a server#
The first step is to create a TcpServer instance. Creating a server does not initiate bind/listen.
Addresses may be any specified as any valid IPv4 or IPv6 local endpoint, e.g.:
127.0.0.1for localhost only0.0.0.0for all adapters- IP address of a particular adapter
TcpServer creation can fail if the endpoint is not well formed: <address>:<port>.
- Rust
- C
- Java
- C#
tip
The LinkErrorMode controls what happens when malformed link-layer frames are received. The typical behavior is to close the socket
as data should never be corrupted over TCP. This value may be set to Discard in which case the parser will discard errors and search for the start of the
next frame. This behavior is required if you are connecting to a terminal server which bridges TCP to a serial port.
Adding Outstation(s)#
You can now associate one or more outstations with the TcpServer. The TcpServer::addOutstation method takes all of the components discussed in previous sections,
followed by an AddressFilter. The filter controls which masters are allowed to associate with a particular outstation. If the filter overlaps with the filter
of an existing outstation, i.e. they would both allow the same address, then TcpServer::addOutstation will fail.
- Rust
- C
- Java
- C#
note
The terminology differs here between Rust and bindings. The Rust API's add_outstation method doesn't spawn it onto the runtime.
The examples above use AddressFilter.any() to allow any master IP address to connect:
If an outstation is already connected to a master, and another matching IP address attempts to connect, the existing connection will be closed and the outstation will begin a communication session with the new master.
ConnectionStateListener#
The ConnectionStateListener interface is only specified for connection oriented transport (e.g. TCP) when adding an outstation to the server. It has a single
method that informs user code when a TCP connection has been established to the outstation. The listener only fires a connected event when an IP address matching
the AddressFilter is received. If the outstation is already connected and processing a connection, and another matching connection is received, then the listener
will fire a disconnected event before firing a connected event.
Binding the Server#
When all of the outstation associated with the server have been added, it is time to bind the server and begin accepting connections.
- Rust
- C
- Java
- C#
note
The terminology differs here between Rust and bindings.
Binding may fail if the underlying socket bind/listen calls fail, e.g. if another process is already bound to that port.