为什么伯克利套接字需要字节交换?

时间:2019-06-01 15:11:57

标签: c sockets berkeley-sockets

我了解到,大多数整数都是大尾数格式。

但是为什么在sockaddr_in之类的结构中而不是实际上所有底层工作实际发生的内核中进行字节交换是应用程序的负担呢?如果用户空间API与平台无关,并且不应该对此进行处理,那将更有意义。

为什么Berkeley套接字API是这样设计的?

2 个答案:

答案 0 :(得分:0)

原因可能是历史原因

(1980年代)Sun-3(MC68030)和Sun-4(Sparc)工作站是当之无愧的发明了套接字API。这些endianness(按当今的标准发展缓慢)的处理器很重要。

我忘记了细节,可能已经为某些PDP-11VAX-780发明了BSD套接字约定。

  

但是为什么在像sockaddr_in这样的结构而不是内核中进行字节交换是应用程序的负担

可能是因为在1980年代,您不希望计算机(比手机慢一千倍)在内核区域花费过多(不间断)的时间。

实际上应该在https://retrocomputing.stackexchange.com/上问这个问题(答案在1980年代Unix内核的源代码中)

答案 1 :(得分:0)

我能想到的唯一技术优势是它允许应用程序执行一次转换并将其缓存。

然后,对于无数次呼叫说sendto()的UDP或您有什么要求,如果需要的话,重新排序的地址将提供给OS,该OS可以将其原样直接复制到传出网络数据包中。

在内核中执行此操作的另一种方法是,每次调用sendto()时,都要一遍又一遍地获取应用程序所知道的相同地址,并每次都将其重新转换。

由于sendto()受益于此,因此他们的其余API都以相同的方式工作。