gpt4 book ai didi

c++ - 在 C/C++ 中实现通信协议(protocol)

转载 作者:IT老高 更新时间:2023-10-28 22:36:56 39 4
gpt4 key购买 nike

我正在开始在软件中实现一些专有的通信协议(protocol)栈,但不知道从哪里开始。这是我以前没有做过的工作,我正在寻求最佳/推荐方法的资源方面的帮助。

我将使用 c/c++,我可以自由使用库 (BSD/BOOST/Apache),但没有 GPL。我已经广泛使用 C++,所以使用 C++ 的特性是没有问题的。

协议(protocol)栈共有三层,并且已经完全指定并正式验证。所以我需要做的就是用指定的语言实现和测试它。还应该提到,协议(protocol)非常简单,但可以通过可靠的物理传输层在不同的设备上运行。我知道协议(protocol)状态机的事件、输入、输出、副作用和行为。一般情况下,接收中断来读取从物理层接收到的消息以读取它并发送到等待设备。接收设备可以对响应消息进行处理,并将其传递给协议(protocol)层,在物理层上发送出去。

任何有关引用/建议的帮助将不胜感激。如果只是为了帮助我理解如何实现它们,我愿意使用不同的语言,但我最终将不得不求助于选择的语言。

更新: 我希望实现的示例协议(protocol)类似于 SNEP .

我不需要担心连接管理。我们可以假设连接已经建立,并且协议(protocol)所做的是数据交换,其中协议(protocol)消息已经在规范中明确定义

最佳答案

从接口(interface)和消息开始。

声明允许对等点交换消息的 session 接口(interface)。将消息声明为具有简单类型的 C++ 结构,如整数、 double 、std::string 和 std::vector。例如:

// 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;
};

然后通过编码使用这些接口(interface)的业务逻辑来测试您的接口(interface)。一旦您确信接口(interface)允许您实现所需的逻辑,就可以使用您喜欢的事件驱动框架(如 libevent 或 Boost.Asio)实现接口(interface)和消息序列化。

编辑:请注意,接口(interface)允许您拥有模拟或测试实现。此外,序列化发生在接口(interface)后面这一事实意味着,对于进程内对等点,您不必序列化和反序列化消息,您可以按原样传递它们。

关于c++ - 在 C/C++ 中实现通信协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899542/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com