server_protocol.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. use std::sync::Arc;
  2. use log::*;
  3. use smol::{Async, Executor};
  4. use std::net::{SocketAddr, TcpListener};
  5. //use super::protocol;
  6. use crate::error::Result;
  7. use crate::net::net;
  8. use crate::net::protocol::protocol_base;
  9. use crate::utility::{AddrsStorage, ConnectionsMap};
  10. pub struct ServerProtocol {
  11. send_sx: async_channel::Sender<net::Message>,
  12. send_rx: async_channel::Receiver<net::Message>,
  13. connections: ConnectionsMap,
  14. }
  15. impl ServerProtocol {
  16. pub fn new(connections: ConnectionsMap) -> Self {
  17. let (send_sx, send_rx) = async_channel::unbounded::<net::Message>();
  18. Self {
  19. send_sx,
  20. send_rx,
  21. connections,
  22. }
  23. }
  24. pub fn get_send_pipe(&self) -> async_channel::Sender<net::Message> {
  25. self.send_sx.clone()
  26. }
  27. pub async fn start(
  28. &mut self,
  29. address: SocketAddr,
  30. stored_addrs: AddrsStorage,
  31. executor: std::sync::Arc<Executor<'_>>,
  32. ) -> Result<()> {
  33. let listener = Async::<TcpListener>::bind(address)?;
  34. info!("Listening on {}", listener.get_ref().local_addr()?);
  35. loop {
  36. let (stream, peer_addr) = listener.accept().await?;
  37. info!("Accepted client: {}", peer_addr);
  38. let stream = async_dup::Arc::new(stream);
  39. let (send_sx, send_rx) = (self.send_sx.clone(), self.send_rx.clone());
  40. let connections = self.connections.clone();
  41. connections.lock().await.insert(peer_addr, send_sx.clone());
  42. let stored_addrs = stored_addrs.clone();
  43. let executor2 = executor.clone();
  44. executor
  45. .spawn(async move {
  46. match Self::event_loop_process(
  47. stream,
  48. stored_addrs,
  49. (send_sx, send_rx),
  50. connections.clone(),
  51. executor2,
  52. )
  53. .await
  54. {
  55. Ok(()) => {
  56. warn!("Peer {} timeout", peer_addr);
  57. }
  58. Err(err) => {
  59. warn!("Peer {} disconnected: {}", peer_addr, err);
  60. }
  61. }
  62. connections.lock().await.remove(&peer_addr);
  63. })
  64. .detach();
  65. }
  66. }
  67. pub async fn event_loop_process(
  68. mut stream: net::AsyncTcpStream,
  69. stored_addrs: AddrsStorage,
  70. (send_sx, send_rx): (
  71. async_channel::Sender<net::Message>,
  72. async_channel::Receiver<net::Message>,
  73. ),
  74. connections: ConnectionsMap,
  75. executor: Arc<Executor<'_>>,
  76. ) -> Result<()> {
  77. let inactivity_timer = net::InactivityTimer::new(executor.clone());
  78. loop {
  79. let event = net::select_event(&mut stream, &send_rx, &inactivity_timer).await?;
  80. match event {
  81. net::Event::Send(message) => {
  82. net::send_message(&mut stream, message).await?;
  83. }
  84. net::Event::Receive(message) => {
  85. inactivity_timer.reset().await?;
  86. protocol_base::protocol(
  87. message,
  88. &stored_addrs,
  89. &send_sx,
  90. None,
  91. connections.clone(),
  92. )
  93. .await?;
  94. }
  95. net::Event::Timeout => break,
  96. }
  97. }
  98. inactivity_timer.stop().await;
  99. // Connection timed out
  100. Ok(())
  101. }
  102. }