@@ -36,38 +36,44 @@ void polymorph::network::udp::AConnector::_doReceive()
3636{
3737 _receiveInProgress = false ;
3838 _socket.async_receive_from (asio::buffer (_receiveBuffer), _endpoint,
39- [this ](const asio::error_code &error, std::size_t bytesReceived) {
40- if (error) {
41- std::cerr << " Error while receiving data: " << error.message () << std::endl;
42- return ;
43- }
44- _receiveInProgress = true ;
45- std::vector<std::byte> data (_receiveBuffer.begin (), _receiveBuffer.begin () + bytesReceived);
46- _determinePacket (data);
47- _doReceive ();
48- });
39+ [this ](const asio::error_code &error, std::size_t bytesReceived) {
40+ if (error == asio::error::operation_aborted || _stopping)
41+ return ;
42+ if (error) {
43+ std::cerr << " Error while receiving data: " << error.message () << std::endl;
44+ return ;
45+ }
46+ _receiveInProgress = true ;
47+ std::vector<std::byte> data (_receiveBuffer.begin (), _receiveBuffer.begin () + bytesReceived);
48+ _determinePacket (data);
49+ _doReceive ();
50+ }
51+ );
4952}
5053
5154void polymorph::network::udp::AConnector::_doSend ()
5255{
5356 std::lock_guard<std::mutex> lock (_sendQueueMutex);
5457 _socket.async_send_to (asio::buffer (_sendQueue.front ().second ), _sendQueue.front ().first ,
55- [this ](const asio::error_code &error, std::size_t ) {
56- if (error) {
57- std::cerr << " Error while sending packet: " << error.message () << std::endl;
58- return ;
59- }
60- std::unique_lock<std::mutex> lock (_sendQueueMutex);
61- auto header = SerializerTrait<PacketHeader>::deserialize (_sendQueue.front ().second );
62- _packetSent (_sendQueue.front ().first , header, _sendQueue.front ().second );
63- _sendQueue.pop ();
64- if (!_sendQueue.empty ()) {
65- lock.unlock ();
66- _doSend ();
67- } else {
68- _writeInProgress = false ;
69- }
70- });
58+ [this ](const asio::error_code &error, std::size_t ) {
59+ if (error == asio::error::operation_aborted || _stopping)
60+ return ;
61+ if (error) {
62+ std::cerr << " Error while sending packet: " << error.message () << std::endl;
63+ return ;
64+ }
65+ std::unique_lock<std::mutex> lock (_sendQueueMutex);
66+ auto header = SerializerTrait<PacketHeader>::deserialize (_sendQueue.front ().second );
67+ _packetSent (_sendQueue.front ().first , header, _sendQueue.front ().second );
68+ _sendQueue.pop ();
69+ if (!_sendQueue.empty ()) {
70+ lock.unlock ();
71+ _doSend ();
72+ } else {
73+ _writeInProgress = false ;
74+ }
75+ }
76+ );
7177}
7278
7379void polymorph::network::udp::AConnector::_determinePacket (const std::vector<std::byte> &data)
@@ -97,3 +103,8 @@ bool polymorph::network::udp::AConnector::isReceiveInProgress() const
97103{
98104 return _receiveInProgress;
99105}
106+
107+ void polymorph::network::udp::AConnector::stop ()
108+ {
109+ _stopping = true ;
110+ }
0 commit comments