diff --git a/src/server.rs b/src/server.rs index 61b7f4a7188392140713abcab9e99217f8a3d945..e56cc6bcccafb16503993d0feae39c3878af788a 100644 --- a/src/server.rs +++ b/src/server.rs @@ -172,10 +172,11 @@ impl CoAPServer { let (tx, rx) = mpsc::channel(); let (tx_send, tx_recv): (TxQueue, RxQueue) = mpsc::channel(); let tx_only = self.socket.try_clone().unwrap(); + let tx_send2 = tx_send.clone(); // Setup and spawn single TX thread let tx_thread = thread::spawn(move || { - transmit_handler(tx_recv, tx_only); + transmit_handler(tx_send2, tx_recv, tx_only); }); // Setup and spawn event loop thread, which will spawn @@ -220,7 +221,7 @@ impl CoAPServer { } } -fn transmit_handler(tx_recv: RxQueue, tx_only: UdpSocket) { +fn transmit_handler(tx_send: TxQueue, tx_recv: RxQueue, tx_only: UdpSocket) { // Note! We should only transmit with this UDP Socket // TODO: Add better support for failure detection or logging loop { @@ -228,7 +229,18 @@ fn transmit_handler(tx_recv: RxQueue, tx_only: UdpSocket) { Ok(q_res) => { match q_res.response.message.to_bytes() { Ok(bytes) => { - let _ = tx_only.send_to(&bytes[..], &q_res.address); + match tx_only.send_to(&bytes[..], &q_res.address) { + Ok(None) => { + // try to send again, look at https://github.com/Covertness/coap-rs/issues/8 in detail + tx_send.send(q_res).unwrap() + } + Ok(_) => { + continue; + } + Err(_) => { + error!("Failed to send response"); + } + } } Err(_) => { error!("Failed to decode response");