我有一个接收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)
答案 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来解决问题。