了解协议

时间:2010-05-22 20:21:56

标签: protocols network-protocols

伙计们需要一些见解。  我知道协议的定义,对于这个c ++编程来说是新手是非常具有挑战性的 task.I我正在使用SDL / C ++创建一个多线程聊天,这对我来说是一次学习经历 现在我遇到了一个需要克服的驼峰,但是理解它比我想象的要困难一些。我需要制作某种聊天协议,我想......但是我是残局。到目前为止,我一直在用字符串发送消息。现在正在改进应用程序以便客户端可以注册和登录,我需要一种更好的方式来与我的客户端和服务器进行通信。

谢谢。

1 个答案:

答案 0 :(得分:0)

创建表示消息的对象,然后序列化对象,通过网络发送,然后在另一端反序列化。

例如,您可以创建一个名为LoginMessage的类,其中包含两个字段。一个用于用户名,一个用于密码。要登录,您可以执行以下操作:

LoginMessage *msg = new LoginMessage();
msg->username = "Fred";
msg->password = "you'll never guess";

char *serialized_msg = serialize(msg);

// send the bytes over the network

你会在另一端做类似的事情,将字节流转换回对象。

有一些API可用于创建消息对象并为您序列化它们。这是两个受欢迎的。两者都应该适合您的需求。

谷歌的

Protocol Buffers
Thrift通过Facebook

如果您希望序列化消息可读,则可以使用YAML。 Google有一个名为yaml-cpp的API,用于将数据序列化为YAML格式。

<强>更新

这些API用于制作您自己的协议。它们只处理从对象形式到字节流形式的消息转换。它们具有通过网络实际传输消息的功能,但您不需要使用这些功能。你如何设计你的协议。但如果您想手动创建消息,也可以这样做。

我会为您提供一些创建自己的消息格式的建议。

这是一种方法。

将消息的前4个字节表示为无符号整数的消息长度。这有必要确定一条消息的结束位置和下一条消息的开始位置。在读取和写入这四个字节时,您需要在主机和网络字节顺序之间进行转换。

让第5个字节代表消息类型。例如,您可以使用1表示登录请求,2表示登录响应,3表示聊天消息。该字节是解释剩余字节含义所必需的。

剩余的字节将包含消息内容。例如,如果它是登录消息,您将以某种方式将用户名和密码编码为这些字节。如果是聊天消息,这些字节将包含聊天文本。