是否有一种通用模式来表示C ++中的数据包?

时间:2014-08-03 14:53:55

标签: c++ sockets networking packet

我正在用C ++开发多人游戏,我希望在服务器和客户端之间交换很多不同的数据包类型。那些东西有某种标准吗?例如,如果我有一个玩家位置数据包,其中包含玩家的客户ID和位于世界3D空间中的位置。哪种方法更常见/可接受/标准?

struct PacketPlayerPosition
{
    char header;
    int clientID;
    float positionX;
    float positionY;
    float positionZ;
}

或者这样:

class PacketPlayerPosition
{
public:
    PacketPlayerPosition(int id, float x, float y, float z);
    PacketPlayerPosition(char* rawData);
    ~PacketPlayerPosition();

    char* SerializeData();

private:
    char header;
    int m_id;
    float m_posX;
    float m_posY;
    float m_posZ;

}

我看到它的方式,以第一种方式创建它让我们可以轻松地在TCP流UDP数据包中传输数据包,只需将它来回转换为char数组,但另一方面,它很难在更大的服务器架构中管理并传递它。第二种方法甚至可以允许创建一个层次结构并使用多态来传递它并在更大的服务器图片中管理它,但是,每个数据包必须在类中实现序列化/反序列化功能,这看起来很脏。

有人能给出一个真实的世界"一个开源项目的例子,或者只是解释为什么一种方式更受欢迎?

1 个答案:

答案 0 :(得分:0)

我想这可能取决于您将需要的不同数据包类型的数量。

如果您只需要一个小数字但需要层次结构,那么请使用C ++对象。在序列化函数的情况下,您将复制代码,但您将获得您提到的优势。这使代码更易于管理。

这种方法需要大量的序列化函数,因此每次添加新类型的数据包时都会导致重复的代码,但如果该数据包从另一个数据包中下降,则会导致重复的代码。

如果要发送大量不同的数据包,请使用即时可序列化的c结构。此方法避免重复序列化代码,但不允许多态性,因此每次添加另一个可能是另一个数据包的后代的数据包时,您将过度复制代码。

所以,对象:如果大多数数据包可以主要从另一个数据包继承,则代码较少。

结构:如果大多数数据包无法继承,则代码较少。

因此问题是;有多少数据包可以从其他数据包继承?