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

时间:2013-01-07 00:11:11

标签: c++ c tcp network-programming

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

我发送以我创建的格式编码的邮件。它始于' p'然后是消息长度的整数,然后是消息。

ex:p3m15 消息长度为3个字节。它对应于消息15。 然后解析该消息等等。

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

我创建的这个消息协议非常轻量级,效果很好,这就是为什么我在JSON或其他类似的东西上使用它。

我主要担心的是,客户端和服务器应该如何开始交谈?

服务器希望客户端以我的格式发送消息。游戏将永远这样做。

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

解决'这个,我这样做是为了客户端必须发送给我的第一件事是字符串" Hello Server"。

如果发送的第一个字节是!=' H'或者如果他们发给我了> 12个字节和它!=" Hello Server"然后我立即断开它们。

这很有效。我只是想知道我是否做了一些有点天真的事情,或者是否有更多标准方法可以处理:

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

我注意到BitTorrent正在发送' !! BitTorrent协议'在每条消息之前。我应该这样做吗?

对此提出任何建议并使其更安全,更安全将非常有帮助。 感谢

2 个答案:

答案 0 :(得分:2)

可能是您邮件中嵌入的幻数字段。

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

所以你收到的东西后首先要做的是检查magic_number字段是否为0xbadbeef3。

答案 1 :(得分:0)

通常,我使用类似这样的标题来设计协议:

typedef struct {
    uint32_t    signature;
    uint32_t    length;
    uint32_t    message_num;
} header_t;

typedef struct {
    uint32_t    foo;
} message13_t;

发送消息:

message13_t msg;
msg.foo = 0xDEADBEEF;

header_t hdr;
hdr.signature = 0x4F4C494D;         // "MILO"
hdr.length = sizeof(message13_t);
hdr.message_num = 13;

// Send the header
send(s, &hdr, sizeof(hdr), 0);

// Send the message data
send(s, &msg, sizeof(msg), 0);

收到邮件:

header_t hdr;
char* buf;

// Read the header - all messages always have this
recv(s, &hdr, sizeof(hdr), 0);

// allocate a buffer for the rest of the message
buf = malloc(hdr.length);

// Read the rest of the message
recv(s, buf, hdr.length, 0);

此代码显然没有错误检查或确保已发送/接收所有数据。