这是开始与客户沟通的好方法
Good way to start communicating with a client?
我的游戏和服务器的工作方式是这样的:
发送以我创建的格式编码的消息。它以'p'开头,后跟消息长度的整数,然后是消息。
交货:p3m15消息长度为3字节。它对应于消息15。然后解析消息,依此类推。
它是为TCP设计的,可能只发送1字节(因为TCP只需要发送至少8位)。
我创建的这个消息协议是非常轻量级的,并且工作得很好,这就是为什么我使用它而不是JSON或其他的。
我主要关心的是,客户端和服务器应该如何开始对话?
服务器希望客户端以my格式发送消息。游戏总是会这么做。
我遇到的问题是当我在端口1720上测试服务器时。当时有bt流量,我的服务器接收到了。这会导致各种随机"客户端"连接到我的服务器并发送随机垃圾。
为了"解决"这个问题,我使客户端必须发送给我的第一件事是字符串"Hello Server"。
如果发送的第一个字节是!= 'H',或者如果他们发送给我> 12个字节,它是!= "Hello Server",那么我立即断开他们的连接。
这个工作得很好。我只是想知道我是否做了一些有点幼稚的事情,或者是否有更多的标准方法来处理:
-客户端开始与服务器通信-客户端通过你好服务器检查,但沿我行某处我得到一个无效的消息。我可以假设我的应用程序永远不会发送无效消息。如果有,那就是一个bug。现在,如果我检测到一个无效的消息,那么我断开客户端。
我注意到BitTorrent正在发送'!!BitTorrent协议"在每条消息之前。我应该那样做吗?
任何关于这方面的建议,使它更安全,更有保障将非常有帮助。由于也许你的消息中嵌入了一个幻数字段。
struct Message
{
...
unsigned magic_number = 0xbadbeef3;
...
};
所以你收到一些东西后要做的第一件事是检查magic_number字段是否为0xbadbeef3
通常,我设计协议的头是这样的:
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);
这段代码显然没有错误检查或确保所有数据都已发送/接收。
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 使用 c++ 的 http 客户端的默认方法
- 服务器进程等待客户端输入/消息的最佳方法是什么?
- libmosquittopp-示例客户端挂在loop_stop()方法上
- 在C++winsock中处理多个客户端的方法
- 在客户端和远程服务器中比较文件列表的有效方法是什么?
- 在客户端的函数声明头文件中使用类头文件时C++消除包含类头文件的方法
- CORBA客户端是否有访问服务器IOR文件的方法
- 处理客户端连接的最有效方法(套接字编程)
- 在Windows下处理多个客户端连接的最佳方法(不使用线程)
- 如何在 C 或 C++ 中仅使用 GET 和 POST 方法编写 http 协议客户端
- 有没有可靠的方法可以在没有电子邮件客户端的情况下实现电子邮件功能
- 管理客户端在 C 套接字中突然断开连接的好方法
- 向我的 TCP 客户端/服务器应用添加加密层的最直接方法是什么?
- 客户端 API 的make_unique、工厂方法或不同设计
- 安全的服务器-客户端握手方法
- 如何实现一个好的客户端-服务器方法
- Windows消息传递-获取非客户端区域的设备上下文的各种方法
- 如何在客户端实现在DLL中声明的方法
- 当客户端连接越来越少的时候(在linux上使用套接字编程),服务器监听的明智方法是什么?