我的游戏和服务器的工作方式是这样的:
我发送以我创建的格式编码的邮件。它始于' p'然后是消息长度的整数,然后是消息。
ex:p3m15 消息长度为3个字节。它对应于消息15。 然后解析该消息等等。
它专为TCP设计,可能只发送1个字节(因为TCP只需发送至少8位)。
我创建的这个消息协议非常轻量级,效果很好,这就是为什么我在JSON或其他类似的东西上使用它。
我主要担心的是,客户端和服务器应该如何开始交谈?
服务器希望客户端以我的格式发送消息。游戏将永远这样做。
我遇到的问题是当我在端口1720上测试我的服务器时。有BitTorrent流量,我的服务器正在接收它。这导致各种随机客户'连接到我的服务器并发送随机垃圾。
解决'这个,我这样做是为了客户端必须发送给我的第一件事是字符串" Hello Server"。
如果发送的第一个字节是!=' H'或者如果他们发给我了> 12个字节和它!=" Hello Server"然后我立即断开它们。
这很有效。我只是想知道我是否做了一些有点天真的事情,或者是否有更多标准方法可以处理:
- 客户端开始与服务器通信 -Clients传递Hello Server检查,但在某行的某处,我得到一条无效的消息。我可以假设我的应用程序永远不会发送无效消息。如果是这样,那将是一个错误。现在,如果我检测到无效消息,则断开客户端连接。
我注意到BitTorrent正在发送' !! BitTorrent协议'在每条消息之前。我应该这样做吗?
对此提出任何建议并使其更安全,更安全将非常有帮助。 感谢
答案 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);
此代码显然没有错误检查或确保已发送/接收所有数据。