C++ 通过套接字发送字符串

Posted

技术标签:

【中文标题】C++ 通过套接字发送字符串【英文标题】:C++ sending string over socket 【发布时间】:2013-03-22 10:35:20 【问题描述】:

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

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

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

【问题讨论】:

7 位 ASCII 字母是当今所有主要和次要平台的标准。因此,除非您想在操作系统上发送扩展的 8 位字母表中的字符,否则这应该不是问题。或者您可以将其编码为UTF-8(这与标准 ASCII 字母表中的 128 个第一个“字母”相同)。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

根据我的经验,当你发送一个类似的字符串时:

string myString = "Hello World";

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

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

一个字节总是 8 位 :)

问候

【讨论】:

【参考方案3】:

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

最好的问候。

【讨论】:

以上是关于C++ 通过套接字发送字符串的主要内容,如果未能解决你的问题,请参考以下文章

C ++单个字符未通过套接字发送

如何在 c++ 和 java 之间通过 udp 有效发送数据数组

C++ linux套接字,在一次调用中将字符串数组(char**)作为连接字符串发送

通过Java中的套接字发送字符串而不是字节

通过套接字发送字符串(python)

通过套接字以字符串形式发送数据的好方法是啥?