@@ -33,7 +33,8 @@ ProtoConv::ProtoConv(const CmdArgs& Args, asio::io_context& IOC):
33
33
IOC(IOC),
34
34
local_ep(asio::ip::address::from_string(Args.LocalAddr.getValue()),Args.LocalPort.getValue()),
35
35
remote_ep(asio::ip::address::from_string(Args.RemoteAddr.getValue()),Args.RemotePort.getValue()),
36
- socket(IOC,local_ep)
36
+ socket(IOC,local_ep),
37
+ socket_strand(IOC)
37
38
{
38
39
if (Args.FrameProtocol .getValue () == " DNP3" )
39
40
pFramer = std::make_shared<DNP3FrameChecker>();
@@ -75,16 +76,16 @@ ProtoConv::ProtoConv(const CmdArgs& Args, asio::io_context& IOC):
75
76
pStream = std::make_shared<SerialStreamHandler>(pSerialMan);
76
77
}
77
78
78
- RcvUDP ();
79
+ socket_strand. post ([ this ](){ RcvUDP ();} );
79
80
spdlog::get (" ProtoConv" )->info (" Listening for UDP on {}:{}" ,Args.LocalAddr .getValue (),Args.LocalPort .getValue ());
80
81
}
81
82
82
83
void ProtoConv::RcvUDP ()
83
84
{
84
- socket.async_receive (asio::buffer (rcv_buf.data (),rcv_buf.size ()),[this ](asio::error_code err, size_t n)
85
+ socket.async_receive (asio::buffer (rcv_buf.data (),rcv_buf.size ()),socket_strand. wrap ( [this ](asio::error_code err, size_t n)
85
86
{
86
87
RcvUDPHandler (err,n);
87
- });
88
+ })) ;
88
89
}
89
90
90
91
void ProtoConv::RcvUDPHandler (const asio::error_code err, const size_t n)
@@ -116,7 +117,10 @@ void ProtoConv::RcvStreamHandler(buf_t& buf)
116
117
buf.sgetn (pForwardBuf.get (),frame_len);
117
118
118
119
spdlog::get (" ProtoConv" )->trace (" RcvStreamHandler(): Forwarding frame length {} to UDP" ,frame_len);
119
- socket.async_send_to (asio::buffer (pForwardBuf.get (),frame_len),remote_ep,[pForwardBuf](asio::error_code,size_t ){});
120
+ socket_strand.post ([this ,pForwardBuf,frame_len]()
121
+ {
122
+ socket.async_send (asio::buffer (pForwardBuf.get (),frame_len),[pForwardBuf](asio::error_code,size_t ){});
123
+ });
120
124
}
121
125
}
122
126
0 commit comments