IPC的sprintf或itoa或memcpy

时间:2012-02-29 13:24:15

标签: c ipc

一个过程说PA想要通过在填充值后用char buf发送它来向PB发送2个整数的值。假设PA和PB在同一台机器上。 PB知道它读取的缓冲区包含2个整数的值。

uint x=1;

uint y=65534;
  • 案例1

PA写入char buf,如图所示

sprintf(buff,"%d%d",x,y);

Q1 - 在这种情况下,PB如何能够将其值提取为1和65534,因为它只有一个包含1,6,5,5,3,4的数组。问题是使用sprintf吗?

  • 案例2

PA使用itoa函数填充缓冲区中的整数值。 PB使用atoi从缓冲区中提取值。 由于itoa在每个值之后放置一个空终止符,因此这是可能的。

Q2 - 现在考虑PA运行在32位机器上,内核为4字节,PB运行在16位机器上,内核为2字节。只检查超出范围会使我的代码可移植吗?

问题3 - memcpy是另一种方式吗?

第四季度 - 如何完成这项工作?

4 个答案:

答案 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的格式更“复杂”。或二进制格式。 所有这些协议类型都在各种应用中使用。选择哪种协议取决于您的要求。