c++ - 开始与客户沟通的好方法?

标签 c++ c tcp network-programming

我的游戏和服务器的工作方式是这样的:

我发送以我创建的格式编码的消息。它以“p”开头,后跟一个表示消息长度的整数,然后是消息。

例如:p3m15 该消息的长度为 3 个字节。它对应于消息15。 然后对消息进行解析等等。

它是为 TCP 设计的,可能只发送 1 个字节(因为 TCP 只需发送至少 8 位)。

我创建的这个消息协议(protocol)非常轻量级并且运行良好,这就是为什么我使用它而不是 JSON 或其他协议(protocol)。

我主要关心的是,客户端和服务器应该如何开始对话?

服务器希望客户端以我的格式发送消息。游戏总是会这样做。

我遇到的问题是当我在端口 1720 上测试我的服务器时。有 BitTorrent 流量,我的服务器正在接收它。这导致各种随机“客户端”连接到我的服务器并发送随机垃圾。

为了“解决”这个问题,我让客户端必须向我发送的第一件事是字符串“Hello Server”。

如果发送的第一个字节是!=“H”,或者如果他们向我发送了> 12个字节并且它是!=“Hello Server”,那么我立即断开它们的连接。

这很好用。我只是想知道我做的事情是否有点天真,或者是否有更标准的方法来处理:

-客户端开始与服务器通信 - 客户端通过 Hello Server 检查,但在某处我收到无效消息。我可以假设我的应用程序永远不会发送无效消息。如果确实如此,那将是一个错误。现在,如果我检测到无效消息,则会断开客户端连接。

我注意到 BitTorrent 在每条消息之前发送“!!BitTorrent 协议(protocol)”。我应该做这样的事情吗?

对此的任何建议以及使其更安全的建议都会非常有帮助。 谢谢

最佳答案

也许在您的消息中嵌入了一个神奇的数字字段。

struct Message
{
    ...
    unsigned magic_number = 0xbadbeef3;
    ...
};

所以收到东西后你要做的第一件事就是检查 magic_number 字段是否为 0xbadbeef3。

关于c++ - 开始与客户沟通的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188207/

相关文章:

c++ - 我正在尝试使用函数将文本文件读入 C++ 中的数组

c++ - 应该如何阅读此 C++ 语法?

c++ - Cuda 错误未定义对 'cufftPlan1d' 的引用?

node.js - Azure 中的 node.js RabbitMQ 使用者上的 ECONNRESET

c++ - 识别访问互联网的进程

c++ - 在 bitset 中随机选择 set bit 位置的最佳 C++ 方法

c - 我的代码无法将我输入的数据放入我的txt文件中,不知道我哪里做错了

c - UNICODE 和 _UNICODE 之间的区别

c - struct 没有从 c 上的函数正确返回

c++ - 如何确保从 tcp/ip 套接字获取最新数据?