Skip to content

Commit f6f0735

Browse files
committed
Add --timeout flag to configure the read/write timeout
This might be needed for slow Modbus devices (#9)
1 parent 2da2625 commit f6f0735

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

cmd/server.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,19 @@ import (
2727
"os"
2828
"os/signal"
2929
"syscall"
30+
"time"
3031

3132
"github.com/ingmarstein/tcp-multiplexer/pkg/message"
3233
"github.com/ingmarstein/tcp-multiplexer/pkg/multiplexer"
3334
"github.com/spf13/cobra"
3435
)
3536

36-
var port string
37-
var targetServer string
38-
var applicationProtocol string
37+
var (
38+
port string
39+
targetServer string
40+
applicationProtocol string
41+
timeout int
42+
)
3943

4044
// serverCmd represents the server command
4145
var serverCmd = &cobra.Command{
@@ -56,7 +60,7 @@ var serverCmd = &cobra.Command{
5660
os.Exit(2)
5761
}
5862

59-
mux := multiplexer.New(targetServer, port, msgReader)
63+
mux := multiplexer.New(targetServer, port, msgReader, time.Duration(timeout)*time.Second)
6064
go func() {
6165
err := mux.Start()
6266
if err != nil {
@@ -87,4 +91,5 @@ func init() {
8791
serverCmd.Flags().StringVarP(&port, "listen", "l", "8000", "multiplexer will listen on")
8892
serverCmd.Flags().StringVarP(&targetServer, "targetServer", "t", "127.0.0.1:1234", "multiplexer will forward message to")
8993
serverCmd.Flags().StringVarP(&applicationProtocol, "applicationProtocol", "p", "echo", "multiplexer will parse to message echo/http/iso8583/modbus")
94+
serverCmd.Flags().IntVar(&timeout, "timeout", 60, "timeout in seconds")
9095
}

pkg/multiplexer/multiplexer.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type (
2929
targetServer string
3030
port string
3131
messageReader message.Reader
32+
timeout time.Duration
3233
l net.Listener
3334
quit chan struct{}
3435
wg *sync.WaitGroup
@@ -42,19 +43,20 @@ const (
4243
Packet
4344
)
4445

45-
func deadline() time.Time {
46-
return time.Now().Add(60 * time.Second)
47-
}
48-
49-
func New(targetServer, port string, messageReader message.Reader) Multiplexer {
46+
func New(targetServer, port string, messageReader message.Reader, timeout time.Duration) Multiplexer {
5047
return Multiplexer{
5148
targetServer: targetServer,
5249
port: port,
5350
messageReader: messageReader,
5451
quit: make(chan struct{}),
52+
timeout: timeout,
5553
}
5654
}
5755

56+
func (mux *Multiplexer) deadline() time.Time {
57+
return time.Now().Add(mux.timeout)
58+
}
59+
5860
func (mux *Multiplexer) Start() error {
5961
var err error
6062
mux.l, err = net.Listen("tcp", ":"+mux.port)
@@ -112,7 +114,7 @@ func (mux *Multiplexer) handleConnection(conn net.Conn, sender chan<- *reqContai
112114
callback := make(chan *respContainer)
113115

114116
for {
115-
err := conn.SetReadDeadline(deadline())
117+
err := conn.SetReadDeadline(mux.deadline())
116118
if err != nil {
117119
slog.Error(fmt.Sprintf("error setting read deadline: %v", err))
118120
}
@@ -143,7 +145,7 @@ func (mux *Multiplexer) handleConnection(conn net.Conn, sender chan<- *reqContai
143145
}
144146

145147
// write back
146-
err = conn.SetWriteDeadline(deadline())
148+
err = conn.SetWriteDeadline(mux.deadline())
147149
if err != nil {
148150
slog.Error(fmt.Sprintf("error setting write deadline: %v", err))
149151
}
@@ -201,7 +203,7 @@ func (mux *Multiplexer) targetConnLoop(requestQueue <-chan *reqContainer) {
201203
conn = mux.createTargetConn()
202204
}
203205

204-
err := conn.SetWriteDeadline(deadline())
206+
err := conn.SetWriteDeadline(mux.deadline())
205207
if err != nil {
206208
slog.Error(fmt.Sprintf("error setting write deadline: %v", err))
207209
}
@@ -222,7 +224,7 @@ func (mux *Multiplexer) targetConnLoop(requestQueue <-chan *reqContainer) {
222224
continue
223225
}
224226

225-
err = conn.SetReadDeadline(deadline())
227+
err = conn.SetReadDeadline(mux.deadline())
226228
if err != nil {
227229
slog.Error(fmt.Sprintf("error setting read deadline: %v", err))
228230
}

0 commit comments

Comments
 (0)