Почему сокеты Беркли требуют замены байтов? - PullRequest
3 голосов
/ 01 июня 2019

Я понимаю, что в проводнике большинство целых чисел имеют формат с прямым порядком байтов.

Но почему бремя приложения заключается в обмене байтами в структурах, подобных sockaddr_in, а не в ядрах, где фактически выполняется вся работа на низком уровне? Было бы разумнее, если бы пользовательский API был более независимым от платформы и не должен был с этим справляться.

Почему API сокетов Беркли был разработан так?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Единственное техническое преимущество, которое я могу себе представить, заключается в том, что оно позволяет приложению выполнить преобразование один раз и кэшировать его.

Затем, для множества вызовов, скажем sendto() для UDP, или что у вас,адрес «переупорядоченный при необходимости» передается в ОС, которая может копировать его «как есть» непосредственно в исходящие сетевые пакеты.

В качестве альтернативы выполнению этого в ядре потребуется каждый вызов sendto() длявозьмите то, что приложение знает как один и тот же адрес снова и снова, и пересчитывайте его каждый раз.

Так как sendto() выигрывает от этого, остальные API работают одинаково.

0 голосов
/ 01 июня 2019

Причина, вероятно, историческая .

API сокетов был изобретен (в 1980-х годах), когда Sun-3 (MC68030) и Sun-4 (Sparc) рабочие станции были королями.Значение endianness этих (медленных по сегодняшним меркам) процессоров имело значение.

Я забыл детали, и, возможно, для некоторых PDP-11 были изобретены соглашения о сокетах BSD. VAX-780 .

Но почему бремя приложения заключается в обмене байтов в структурах, таких как sockaddr_in, а не в ядрах

Возможно, потому, что в 1980-х вы не хотели, чтобы компьютер (в тысячу раз медленнее, чем ваш мобильный телефон) проводил слишком много (непрерывно) времени в стране ядра.

Этот вопрос действительно следует задавать на https://retrocomputing.stackexchange.com/ (и его ответ находится в исходном коде ядра Unix 1980-х годов)

...