1

我正在做一个小型客户端/服务器项目作为 C++ 课程的最终项目。我们得到了一些处理通信的类(使用 sys/socket.h),我们基本上connection->send(byte)可以发送一个字节的数据。

假设我有一个要发送的字符串。当从客户端发送到服务器时,如何确保“a”被解释为“a”,反之亦然?由于标准没有说明 char 默认为 unsigned 或 signed 我不知道如何处理它。

我有一些想法,我可以std::numeric_limits<char>::min()在每一端减去,但我不确定它是否是一个好的。

4

3 回答 3

5

TCP 和 UDP 都不关心字符串的编码。它总是被解释为一个字节数组。因此,为了确保您的字符串被正确解释,服务器和客户端必须就通用编码达成一致。

在您的情况下,我将简单地使用c_str()std::string 的方法来发送字符串并通过将接收到的数据解释为const char*(对于 ASCII 字符串)来分配字符串。只要客户端应用程序和服务器应用程序使用相同的字符串库,这应该可以工作。

于 2013-03-22T10:41:23.077 回答
1

要验证您的通信,您应该使用网络嗅探器。Wireshark 是一个不错的选择。

如果嗅探器捕获您的以太网数据包并说它有一个“a”,那么您可以非常确定您发送了一个“a”。

以我的经验,当您发送具有类似内容的字符串时:

string myString = "Hello World";

mySocket.send(myString.c_str(), myString.length());

如果我使用 (char*) 或 (unsigned char*) 对 myString.c_str() 进行强制转换,结果是相同的。

一个字节总是 8 位 :)

问候

于 2013-03-22T10:47:19.560 回答
0

其他需要注意的是,CPU 的字节序,大于 1 字节的类型可能是个问题。尝试将大端作为标准,因为它是大多数常见网络协议的标准。

最好的祝福。

于 2013-03-22T15:40:15.903 回答