【问题标题】:Sending a null terminating character over a socket in c通过 c 中的套接字发送空终止字符
【发布时间】:2016-02-29 19:28:26
【问题描述】:

我正在尝试将一个包含空终止字符的字符串发送到另一个连接。

现在我并不笨,我知道一个字符串会在那个字符处停止,但是有没有任何可能的方法可以将字符串发送到这样的套接字,“Test\x00AFTERNULL\x00\r\n”。

我在想也许有一种方法可以将其从一种编码转换为另一种编码。我在这方面并不完全聪明。感谢您的任何帮助/意见。

【问题讨论】:

  • 哪个操作系统?我知道的套接字函数不对字符串进行操作。

标签: c sockets null


【解决方案1】:

通过socket发送与字符串中间是否有null无关,因为send()会发送一个特定大小的缓冲区。

这个缓冲区的中间可以有任意数量的零。您可能已经使用strlen() 来获取字符串的大小并在send() 中使用它,这会导致缓冲区长度不正确并丢失部分数据。

例如,您可以这样做(非常简单):

char buf[] = "Test\0AFTERNULL\0\r\n";
//'s' is socket descriptor
send(s, buf, sizeof(buf), 0);

【讨论】:

  • 在这个简单的示例中,您可能希望使用sizeof(buf) - 1 作为长度,除非您想在'\n' 之后包含空终止符。
  • @IanAbbott 虽然我同意 OP 还声明了要发送的字符串 双引号,所以他可能希望在消息中包含尾随空字节。
  • 当我使用十六进制 \x00 时不起作用,但是当我用 ascii \0 替换它时它起作用了。非常感谢。
【解决方案2】:

通过套接字发送和接收数据使用字节数组,而不是字符串。 示例:创建数组:{'T', 'E', 'S','T', 0, 'A'},通过 leng 为 6 的套接字发送。另一个套接字将收到相同的数组

【讨论】:

  • 在 C 中,没有 byte 类型和 typeof('V') == intleng 是什么?
  • 字节表示 char 或 unsigned char(因为它的大小是 1 字节)。 'V' 的类型是字符。长度表示您要通过套接字发送的字节数
  • @cad,在 C 中,一个字节是可寻址存储的最小单位。
  • @IanAbbott 我很清楚这一点。不过,为了清楚起见,他可能会考虑用char 替换“字节”,并执行一些其他更改来改进他的帖子。还是您认为答案好?
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多