2011-02-04 117 views
11

我正在開始在軟件中實現一些專有通信協議棧,但不確定從何處開始。這是我以前從未做過的工作,我正在尋求資源方面的幫助,以獲得最佳/推薦的方法。C/C++中的實現通信協議

我將使用c/C++,而且我可以自由使用使用庫(BSD/BOOST/Apache),但不支持GPL。我廣泛使用了C++,因此使用C++的功能不成問題。

協議棧有三層,它已經完全指定並正式驗證。所以我需要做的就是用指定的語言完全實現和測試它。還應該提及該協議非常簡單,但可以通過可靠的物理傳輸層在不同設備上運行。我知道事件,輸入,輸出,副作用和協議狀態機的行爲。一般情況下,接收到一箇中斷來讀取從物理層接收到的消息以讀取併發送到等待設備。接收設備可以處理並傳遞響應消息到協議層,在物理層上發送出去。

任何幫助參考/建議將不勝感激。我願意使用不同的語言,只是爲了幫助我理解如何實現它們,但我將不得不採用所選擇的語言。

更新:我希望實施的示例協議類似於SNEP

我不需要擔心連接管理。我們可以假設該連接已經建立和我的協議的作用是在協議消息早已在規範中定義的數據交換

+1

這個問題太籠統了,開始設計和實施它,並就您發現的具體問題尋求幫助。 – peoro 2011-02-04 15:17:15

+1

這是一個有趣的任務。在設計實現時,請記住,您要使用單元測試來測試每個圖層獨立性。要獲得更具體的幫助,請嘗試指定從哪裏開始(擺脫與PIO連接的引腳??)以及您想獲得什麼樣的幫助。 – harper 2011-02-04 15:23:33

回答

8

從接口和消息開始。

聲明允許對等體交換消息的會話接口。將消息聲明爲具有簡單類型的C++結構體,如int,double,std :: string's和and std :: vectors。例如:

// these are your protocol messages 
struct HelloRequest { 
    uint32_t seq_no; 
    // more stuff 
}; 
struct HelloResponse { 
    uint32_t seq_no; 
    // more stuff 
}; 

// Session callback for received messages 
struct SessionReceiver { 
    virtual void connected(Session*) = 0; 
    virtual void receive(Session* from, HelloRequest msg) = 0; 
    virtual void receive(Session* from, HelloResponse msg) = 0; 
    virtual void disconnected(Session*) = 0; 
}; 

// Session interface to send messages 
struct Session { 
    virtual void send(HelloRequest msg) = 0; 
    virtual void send(HelloResponse msg) = 0; 
}; 

// this connects asynchronously and then calls SessionReceiver::connected() with a newly established session 
struct SessionInitiator { 
    virtual void connect(SessionReceiver* cb, std::string peer) = 0; 
}; 

// this accepts connections asynchronously and then calls SessionReceiver::connected() with a newly accepted session 
struct SessionAcceptor { 
    virtual void listen(SessionReceiver* cb, std::string port) = 0; 
}; 

然後通過編碼使用這些接口的業務邏輯來測試您的接口。一旦您確信接口允許您實現所需的邏輯,就可以使用您喜歡的事件驅動框架(如libevent或Boost.Asio)來實現消息的接口和序列化。

編輯: 請注意,接口允許您進行模擬或測試實現。此外,序列化發生在接口後面的事實意味着對於進程內對等體,您不必序列化和反序列化消息,您可以按原樣傳遞它們。

3

Boost.ASIO是相當切削刃,當涉及到異步(或同步)在C網的通信++

3

看看Google Protocol Buffers

從描述:

協議緩衝器是一個靈活,高效的,自動化用於序列化的結構化數據的機制 - XML,但是更小,更快,更簡單。您可以定義一次數據的結構,然後您可以使用特殊的源代碼輕鬆地將結構化數據寫入各種數據流並使用各種語言讀取和讀取數據。您甚至可以更新您的數據結構,而不會中斷根據「舊」格式編譯的已部署程序。

Protocol Buffers是語言和平臺中性,因此應該適合您的項目。我找不到許可證,但至少它沒有在我能找到的任何地方說「GPL」。

這將幫助你的協議。通過實際的數據傳輸,除非你自己編寫操作系統,否則應該使用一些原語。除非您提供更多細節,否則很難給出更準確的實施幫助。例如,你在使用什麼通訊渠道?以太網?

但作爲一個經驗法則,你應該儘可能縮短ISR。在這些通常意味着將數據複製到環形緩衝區的解決方案中。這樣你就不必在ISR中分配內存。在複製數據之後,ISR應通知包的上層。如果您可以使用DMA,請使用它。在這種情況下,甚至可以在開始DMA傳輸之前發送通知。

您可能還想特別查看Linux Device Drivers,chapter 10。查看關於底部和頂部兩半的部分。