1

我是 TCP/IP 协议的新手,想用 C++ 创建一个聊天服务器。

现在,我决定以一个字符开始我的所有传输,以告知接下来会发生什么(登录请求、要发布的消息、客户的用户名……)。

因此,我使用 0x01、0x02、... 等值来表示与登录、信息请求等相关的内容,而 0x10 则用于消息。

绝望地,当我尝试用我创建的另一个程序连接到我的服务器时,我从服务器收到一个传输,它以 0x01 开头(所以一切都还可以),但是当我回复以 0x03 开头的东西时,服务器只有当我杀死客户时收到它...

我认为是 select 函数并没有说有什么要读的。

这正常吗?

如果是,我应该用可打印且没有特殊含义的值替换这些值吗?

4

1 回答 1

4

TCP 完全是一个二进制协议。它定义了一个跟在 IP 数据报头之后的数据包头。连续的数据流被分成数据包,因此它(希望)从 A 点平稳地传输到 B 点。该流包含任意八位字节(字节)。

您确定消息之间的唯一区别是初始字节值$01vs$03吗?也许消息大小不同?也许一个实例会做一些事情来刷新流?也许消息是在会话中按顺序发送的?

如果您需要快速传输短而离散的消息,UDP 可能有助于防止意外延迟。

于 2017-02-22T13:56:55.217 回答