2017-10-19 35 views
3

建立連接(220服務就緒)後,SMTP服務器應顯示歡迎消息,這是客戶端開始發送命令的信號。這似乎與tokio-proto的請求 - 響應範式相沖突。如何在客戶端連接到tokio-proto服務器時顯示歡迎消息/橫幅?

我可以想象協議可以完全顛倒,如服務器發送請求和客戶端響應(不建議使用TURN),但目前我只關心連接時的歡迎消息,又名橫幅。之後,客戶端請求=>服務器響應將被維護。

我一直試圖弄清楚在哪裏掛鉤,但bind_serverbind_transport對我來說超級神祕。我是否需要實施運輸?

我在編解碼器的decode方法中有這個。問題是decode方法不被調用,除非有數據可用於解碼哪種類型是有意義的。我期望有一些連接初始化方法可以掛鉤,但我什麼也沒找到。

fn decode(&mut self, buf: &mut BytesMut) -> Result { 

    if !self.initialized { 
     println!(
      "new connection from {:?} to {:?}", 
      self.peer_addr, 
      self.local_addr 
     ); 

     self.requests.push(SmtpCommand::Connect { 
      local_addr: self.local_addr, 
      peer_addr: self.peer_addr, 
     }); 

     self.initialized = true; 
    } 
    //... snip 
    match self.requests.is_empty() { 
     true => Ok(None), 
     false => Ok(Some(self.requests.remove(0))), 
    } 
} 

我的​​和我也opened an issue with tokio-proto

回答

0

實現我自己的有狀態傳輸裝飾器(SmtpConnectTransport)做了竅門。它會在初始化時注入給定的幀。我想通過將initframe類型作爲參數可以將它變成一個通用的解決方案。除了解析和序列化之外,最終編解碼器不需要做任何不尋常的事情。

當連接正確時,該服務可以生成所需的歡迎消息或橫幅。我已經在SmtpCommand::Connect中包含本地和遠程套接字地址,因爲它將用於垃圾郵件檢測。

我的預感是正確的,但工作感覺確實像生鏽的金屬研磨:D我現在很高興這是如何samotop is coming together。以下是一些代碼:

​​
相關問題