2011-02-04 120 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。查看关于底部和顶部两半的部分。