C ++从结束前读取包含空字符的套接字的字符串

时间:2017-05-17 12:32:17

标签: c++ sockets

我有一个接收tcp消息的套接字服务器(用c ++编写),这些消息是已经泄露的数据。

由于通货紧缩(压缩)方法,这些消息可能包含“null”(0)字符。

数据的再存储示例(将字符转换为int并用逗号分隔):

  

141,208,59,10,128,80,12,68,209,222,197,72,94,94,190,   100,55,246,86,238,31,212,82,81,50,76,49,205,169,238,   182,31,75,114,13,73,37,158,162,90,170,171,120,90,197,   117,164,81,116,239,97,162,55,54, 0 ,35,128,241,222,56,   1,102,2,198, 0 ,147,189,9,6,12,208,57,128,206,249,   238,236,31,70, 0 ,227,173,81,34,192,76,192,24,96,178,   55,131,127,204,9, 0

正如您在上面的示例中所看到的,“null”(0)表示在实际结束之前。

所以使用时:

message_size = read( client, buffer, 4096 )

读取在第一个“null”(0)处返回。

是否可以继续阅读以便收到整条信息?

或者这里有什么神奇的伎俩吗?

编辑:使用Linux Centos(2.6.32-642.6.2.el6.x86_64)

3 个答案:

答案 0 :(得分:1)

鉴于read()函数不关心NUL字符,我觉得你可能正在将缓冲区传递给原始的C标准字符串函数之一,它使用NUL终止字符串。

C ++ std::string没有此限制。

答案 1 :(得分:0)

  

是否可以继续阅读以便收到整条信息?

是。使用无格式输入功能。 无格式输入功能不会在终止字符处停止。

编辑:您似乎正在使用POSIX read函数而不是C ++ API。碰巧,POSIX read也不会停止在终结器上。

答案 2 :(得分:0)

AS提到的@Alnitak我正在使用C系列字符串函数,这就是造成奇怪行为的原因。

我使用了strncat()。 我现在通过循环读取接收到的缓冲区,然后使用push_back()将其附加到std :: string来解决问题。