@@ -39,7 +39,8 @@ EthSocketToEthControllerAdapter::EthSocketToEthControllerAdapter(SilKit::IPartic
3939 const std::string& ethernetControllerName,
4040 const std::string& ethernetNetworkName,
4141 bool enableDomainSockets)
42- : _socket{io_context}
42+ : _ioContext{&io_context}
43+ , _socket{io_context}
4344 , _logger{participant->GetLogger ()}
4445 , _ethController(participant->CreateEthernetController (ethernetControllerName, ethernetNetworkName))
4546 , _onNewFrameHandler(std::move([&](std::vector<std::uint8_t > data) {
@@ -117,13 +118,31 @@ EthSocketToEthControllerAdapter::EthSocketToEthControllerAdapter(SilKit::IPartic
117118 _ethController->Activate ();
118119}
119120
121+ void ShutdownEthSocketToEthControllerAdapter (SilKit::Services::Logging::ILogger* logger, asio::io_context* ioContext,
122+ asio::generic::stream_protocol::socket& socket,
123+ const std::string& logMessage)
124+ {
125+ logger->Error (logMessage);
126+ socket.close ();
127+ ioContext->stop ();
128+ #ifdef WIN32
129+ GenerateConsoleCtrlEvent (CTRL_C_EVENT , 0 );
130+ #else
131+ std::raise (SIGINT );
132+ #endif
133+ }
134+
120135void EthSocketToEthControllerAdapter::DoReceiveFrameFromQemu ()
121136{
122137 asio::async_read (_socket, asio::buffer (_frame_size_buffer.data (), _frame_size_buffer.size ()),
123138 [this ](const std::error_code ec, const std::size_t bytes_received) {
124139 if (ec || bytes_received != _frame_size_buffer.size ())
125140 {
126- throw IncompleteReadError{};
141+ const std::string errorMsg =
142+ " Error during socket read. Closing the socket and shutting down the adapter. (error code="
143+ + std::to_string (ec.value ()) + " , message=" + ec.message () + " )" ;
144+
145+ ShutdownEthSocketToEthControllerAdapter (_logger, _ioContext, _socket, errorMsg);
127146 }
128147
129148 std::uint32_t frame_size = 0 ;
@@ -134,14 +153,22 @@ void EthSocketToEthControllerAdapter::DoReceiveFrameFromQemu()
134153
135154 if (frame_size > _frame_data_buffer.size ())
136155 {
137- throw InvalidFrameSizeError{};
156+ const std::string errorMsg =
157+ " Invalid frame size. Closing the socket and shutting down the adapter. (frame size="
158+ + std::to_string (frame_size) + " )" ;
159+
160+ ShutdownEthSocketToEthControllerAdapter (_logger, _ioContext, _socket, errorMsg);
138161 }
139162
140163 asio::async_read (_socket, asio::buffer (_frame_data_buffer.data (), frame_size),
141164 [this , frame_size](const std::error_code ec, const std::size_t bytes_received) {
142165 if (ec || bytes_received != frame_size)
143166 {
144- throw IncompleteReadError{};
167+ const std::string errorMsg =
168+ " Error during socket read. Closing the socket and shutting down the adapter. (error code="
169+ + std::to_string (ec.value ()) + " , message=" + ec.message () + " )" ;
170+
171+ ShutdownEthSocketToEthControllerAdapter (_logger, _ioContext, _socket, errorMsg);
145172 }
146173
147174 auto frame_data = std::vector<std::uint8_t >(frame_size);
0 commit comments