一个过程说PA想要通过在填充值后用char buf发送它来向PB发送2个整数的值。假设PA和PB在同一台机器上。 PB知道它读取的缓冲区包含2个整数的值。
uint x=1;
uint y=65534;
PA写入char buf,如图所示
sprintf(buff,"%d%d",x,y);
Q1 - 在这种情况下,PB如何能够将其值提取为1和65534,因为它只有一个包含1,6,5,5,3,4的数组。问题是使用sprintf
吗?
PA使用itoa
函数填充缓冲区中的整数值。
PB使用atoi
从缓冲区中提取值。
由于itoa
在每个值之后放置一个空终止符,因此这是可能的。
Q2 - 现在考虑PA运行在32位机器上,内核为4字节,PB运行在16位机器上,内核为2字节。只检查超出范围会使我的代码可移植吗?
问题3 - memcpy
是另一种方式吗?
答案 0 :(得分:1)
1)接收方将从网络中读取字符串值,并进行自己的转换;在这种情况下,它将获得165,534的字符串表示。您需要某种方法来分隔接收器的值。
2)检查超出范围是一个良好的开端,但可移植性取决于更多因素,例如定义传输格式,无论是二进制还是文本。
3)什么?
4)通常通过决定数字的二进制表示的标准来完成,即,它是有符号/无符号的16/32/64位值,然后将其转换为通常所说的网络字节顺序[ 1]在发送端,并在接收端将其转换为主机字节顺序。
[1] http://en.wikipedia.org/wiki/Network_byte_order#Endianness_in_networking
答案 1 :(得分:1)
我建议您查看一下
正如您在案例1中注意到的那样,如果您没有其他信息,则无法从缓冲区中提取值。所以你需要一些限制性的角色。
在Q2中你提到了一台16位机器。不仅int的#bytes可能是一个问题,而且还有endianess和sign。
我会做什么:
- 为不同的数字定义一个自己的协议(你不能将4字节的int发送到16位机器并使用相同的类型而不丢失信息)
要么
- 在写入之前检查int(必须适合2个字节)。
我希望这会有所帮助。
答案 2 :(得分:0)
Q1:不使用sprintf
是问题,而是使用它的方式。怎么样:
sprintf(buff,"%d:%d",x,y);
(注意:作为分隔符的逗号可能会导致国际格式出现问题)
Q2:否。其他问题,例如关于字节序,可能会出现
问题3:如果您使用不同的机器,请选择否。在一台机器中,您可以(错误地)将缓冲区用作字节数组。
问题4:不同的方式,例如XDR(http://en.wikipedia.org/wiki/External_Data_Representation)
答案 3 :(得分:0)
您需要协议和传输机制。
传输机制包括套接字,命名管道,共享内存,SSL等。
协议可以像空间分隔的字符串一样简单,如您所建议的那样。它也可能像基于XML的格式更“复杂”。或二进制格式。 所有这些协议类型都在各种应用中使用。选择哪种协议取决于您的要求。