Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 面向对象的同步收发信机设计_C++_C_Oop_Sockets_Protocols - Fatal编程技术网

C++ 面向对象的同步收发信机设计

C++ 面向对象的同步收发信机设计,c++,c,oop,sockets,protocols,C++,C,Oop,Sockets,Protocols,我正在做一个数据通信类的项目,它是一个同步发射机和接收机。发送器将是使用套接字的服务器,当接收器客户端连接时,它将分叉并向接收器发送一条消息,该消息存储在一个文本文件中,作为服务器启动时的参数 我的问题不是实现,我知道如何实现所有这些功能。我的问题是如何在C++中把这个组织成类等。 消息将是2个SYN字符,一个指示消息长度的控制字符,以及最多64字节的消息数据 我的第一个想法是,我想要一个服务器类和一个客户机类。我将有两个主要功能,一个将有一个服务器(发送器)对象,另一个将有一个客户端(接收器)

我正在做一个数据通信类的项目,它是一个同步发射机和接收机。发送器将是使用套接字的服务器,当接收器客户端连接时,它将分叉并向接收器发送一条消息,该消息存储在一个文本文件中,作为服务器启动时的参数

我的问题不是实现,我知道如何实现所有这些功能。我的问题是如何在C++中把这个组织成类等。 消息将是2个SYN字符,一个指示消息长度的控制字符,以及最多64字节的消息数据

我的第一个想法是,我想要一个服务器类和一个客户机类。我将有两个主要功能,一个将有一个服务器(发送器)对象,另一个将有一个客户端(接收器)对象。从这些最高级别的课程开始,我不知道如何组织较低级别的内容

我需要一个独特的“物理”、“数据链接”和“应用”层。物理层将处理将消息转换为二进制、计算奇偶校验等。数据链路层将对消息进行帧处理,应用程序将是最高级别的。如何组织这些?名称空间

正如我所说,实施不是我的问题。就设计而言,我经常感到沮丧,因为我觉得我们在设计和组织方面的知识还不够。C++是我的专长,C也是好的,我只是没有经验,没有类的高级应用程序,等等。
请随意推荐阅读经典设计模式书,因为我有一本。谢谢大家的帮助。

我的建议是,您有一个由客户端和服务器使用的“message”类。该类将封装网络层。由于您希望同时发送和接收消息,因此可能需要两个构造函数——一个用于根据参数组装要发送的消息,另一个用于将原始输入流解析为接收到的消息——或者两个派生类的纯虚拟基

不要试图在消息类中引用服务器或客户端类;将耦合设置为单向,以便服务器/客户端类使用消息对象

还为服务器/客户机类使用纯虚拟基,表示套接字的接口假定TCP:这也是服务器维护连接的基础,因为每个连接都是一个单独的套接字。服务器核心的套接字是一个
listen()
socket,不需要进行任何读写操作,它只是
accept()
s,但当它这样做时,它会创建一个新的连接对象,该对象的套接字将被读写,因此这些是可以由基类包装的例程。总结如下:

abstract class "TCPsocket" 
    -> derived class "Server"
    -> derived class "Client"
    -> derived class "Connection"

服务器对象将包含不同数量的活动连接对象;客户机对象应该只是一个客户机对象。

为什么这个标记为“C”?我建议使用一个
Message
类,它可以处理自己的序列化/反序列化。为什么你需要三个不同的层?我同意这三个不同的层在这里似乎有些过分。我需要它们,因为项目描述上说我需要。这就是为什么我认为像名称空间这样简单的东西可以满足这个要求。所谓纯虚拟基,你指的是一个包含所有纯虚拟函数的抽象类吗?不一定是所有的。一个“纯粹的虚拟”,又名。C++中的“抽象”类至少有一个纯虚方法,因此不能实例化;它只是作为一个基类。我想这里的不必是字面意义上的…我的观点是这样一个基本的“消息”类不会用于实例化。请注意,即使无法实例化该类(因为它确实是抽象的),也可以使用该类型传递对象并使用它——但需要使用非抽象派生类来创建它。这是OOP中多态性的一个重要潜力。其思想是,在“messageIn”和“messageOut”对象中可用的所有代码都将位于基本的“message”类中,与“socket”相关的“client”和“server”也是如此。如前所述,只使用一个消息类和两个不同的构造函数可能更有意义,但是服务器和客户机都从中继承的“流”类可能更好吗?流类可以包含您提到的套接字。确定。以前做过类似的事情之后,这个基类中可能没有大量特定于处理套接字的内容,但从一开始就很好,因为这样一个对象将位于独立服务器和客户端进程的核心。然后,您可以使用相同的基础来实现两个进程的日志记录之类的功能。我充实了与第三个类的关系,表示上面服务器与客户端的连接(如果使用fork,这些也是独立的进程)。