我知道在传输中,大多数整数都是以大端格式表示的。
但是为什么要让应用程序负责在像 sockaddr_in
这样的数据结构中进行字节交换,而不是在内核中进行所有的低级工作呢?如果用户空间API更平台无关,不需要处理这个问题会更有意义。
为什么伯克利套接字API被设计成这样?
我知道在传输中,大多数整数都是以大端格式表示的。
但是为什么要让应用程序负责在像 sockaddr_in
这样的数据结构中进行字节交换,而不是在内核中进行所有的低级工作呢?如果用户空间API更平台无关,不需要处理这个问题会更有意义。
为什么伯克利套接字API被设计成这样?
可能是因为在1980年代,你不希望计算机(比您的手机慢一千倍)在内核空间花费太多(不可中断的)时间。但为什么应用程序要负担像sockaddr_in这样的结构中的字节交换,而不是内核呢?
这个问题应该在https://retrocomputing.stackexchange.com/上问(它的答案在一些20世纪80年代的Unix内核源代码中)。
sendto()
等函数,如果需要重新排序地址,则提供重新排序后的地址给操作系统,操作系统可以直接将其复制到传出的网络数据包中。sendto()
时都重复使用应用程序已知的相同地址,并且每次都要重新转换。sendto()
从中受益,因此它们使API的其余部分以相同的方式工作。
sockaddr_in
结构体类似的操作吗?或者你是在谈论高于 TCP 级别存在的协议,需要将通过recv
填充的缓冲区中的数据进行转换吗? - zwol