【问题标题】:Sending NULL data over a socket通过套接字发送 NULL 数据
【发布时间】:2016-04-06 11:02:18
【问题描述】:

我目前正在尝试通过基于 TCP/IP 的套接字与外部应用程序进行通信。我已经成功地与客户端建立了连接并收到了一些数据。本手册here 指出

收到此命令后,客户端必须读取确认 来自守护进程的八位字节。肯定确认是一个八位字节的零位。否定确认是任何其他模式的八位字节。

我想发送一个肯定的确认,我是这样发送的 我的服务器监听代码来自here

void WriteData(std::string content)
{
    send(newsockfd,content.c_str(),content.length(),0);
}

WriteData("00000000");

我的问题是我是否正确发送了这些数据(零位八位字节)?

更新:

我已经阅读了这篇文章here 其中规定 send 只允许发送一个 char* 数组。所以我不确定如何通过套接字发送一个字节。我知道我可以做这样的事情

std::bitset<8> b1 ;  // [0,0,0,0,0,0,0,0]

但我不确定如何通过套接字发送它。

【问题讨论】:

  • 不知道为什么投反对票或收盘
  • "00000000" 是一个 8 个字符的字符串,不是要约。
  • "00000000" 是一个八字符的字符串,后跟一个空字节。不是零位的八位字节。
  • 感谢您提及,您能否提出一种方法来显示我如何通过套接字发送八位字节,因为套接字只需要一个字符数组
  • 一个八位字节是八位。一个字符。一个 0 位的八位字节是一个 char 值为零。

标签: linux sockets c++11


【解决方案1】:

试试

WriteData(std::string("\0",1));

使用您的功能甚至:

const char null_data(0);
send(newsockfd,&null_data,1,0);

直接发送。


WriteData("00000000");

实际上将发送 8 个 48 [十进制] 八位字节(假设您的平台是所有现代系统都兼容的 ASCII)。

但是\0 是字符串文字中用来表示空字符(即零八位字节)的转义序列。

在 C++ 中,字符和字节的概念之间存在一种混淆(混合在一起),这种概念可以追溯到 C 的早期,并且几乎已经融入其中。

【讨论】:

  • 似乎第二种方法成功了,而WriteData("\0") 不起作用
  • @MistyD,我真傻。当然没有。 std::string 的构造函数会将 null 视为终止符。现已修复。
  • @BasileStarynkevitch 有点。 C++ 实现标准并没有为多字节字符提供很好的处理。但在我们处理的范围内,ASCII 和 Unicode 的所有标准编码重叠。我已将答案修改为“ASCII compatible”。我同意几乎所有现代系统都是 Unicode,而 UTF-8 通常用作最低公分母编码。
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-05-23
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多