Skip to content

Commit 7564016

Browse files
committed
sync write access to ProtoConv UDP socket
1 parent 9e49dab commit 7564016

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

src/ProtoConv/ProtoConv.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ ProtoConv::ProtoConv(const CmdArgs& Args, asio::io_context& IOC):
3333
IOC(IOC),
3434
local_ep(asio::ip::address::from_string(Args.LocalAddr.getValue()),Args.LocalPort.getValue()),
3535
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)
3738
{
3839
if(Args.FrameProtocol.getValue() == "DNP3")
3940
pFramer = std::make_shared<DNP3FrameChecker>();
@@ -75,16 +76,16 @@ ProtoConv::ProtoConv(const CmdArgs& Args, asio::io_context& IOC):
7576
pStream = std::make_shared<SerialStreamHandler>(pSerialMan);
7677
}
7778

78-
RcvUDP();
79+
socket_strand.post([this](){RcvUDP();});
7980
spdlog::get("ProtoConv")->info("Listening for UDP on {}:{}",Args.LocalAddr.getValue(),Args.LocalPort.getValue());
8081
}
8182

8283
void ProtoConv::RcvUDP()
8384
{
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)
8586
{
8687
RcvUDPHandler(err,n);
87-
});
88+
}));
8889
}
8990

9091
void ProtoConv::RcvUDPHandler(const asio::error_code err, const size_t n)
@@ -116,7 +117,10 @@ void ProtoConv::RcvStreamHandler(buf_t& buf)
116117
buf.sgetn(pForwardBuf.get(),frame_len);
117118

118119
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+
});
120124
}
121125
}
122126

src/ProtoConv/ProtoConv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class ProtoConv
4848
const asio::ip::udp::endpoint local_ep;
4949
const asio::ip::udp::endpoint remote_ep;
5050
asio::ip::udp::socket socket;
51+
asio::io_context::strand socket_strand;
5152

5253
std::array<uint8_t, 64L * 1024> rcv_buf{};
5354

0 commit comments

Comments
 (0)