Почему для этого нет стандарта?
Стандартом де-факто являются сокеты BSD, на которых основаны API-интерфейсы сокетов Linux, POSIX и Windows.
Какие еще API-интерфейсы сокетов доступны?
Ничего, что до сих пор широко используется. До того, как сокеты BSD и их производные захватили мир, их было много. Большинство из тех, что остались, вероятно, относятся к миру встраиваемых систем, и даже они уходят, поскольку основные операционные системы продолжают поглощать все больше и больше рынка встраиваемых систем.
К середине 90-х эта битва в значительной степени закончилась. Сокеты BSD победили.
В чем разница между каждым из этих Socket API?
Между вариантами BSD, Linux и POSIX есть незначительные различия, ничего более серьезного, чем любые другие различия между операционными системами Unixy.
Причина, по которой у них есть версия книги для Linux / POSIX, вероятно, больше связана с маркетингом, чем с чем-то техническим. Он отвечает на вопрос, который издатель, вероятно, много видел: «Зачем мне книга BSD, я использую Linux, а не BSD!» Или, что чаще в наши дни: «Что такое BSD?»
С высоты 10 000 футов Winsock сильно отличается от сокетов BSD, но, поскольку это довольно строгий надмножество сокетов BSD, вы все равно можете перенести свои знания. Большинство различий - это чистые расширения сокетов BSD, в основном связанные с различиями в архитектуре ядра Windows и способах построения программ Windows. Например, первым действительно большим расширением были асинхронные сокеты, которые значительно упрощают использование сокетов в однопоточной программе Windows GUI, чем использование чистых сокетов BSD. Более поздние расширения поддерживают специальные функции, доступные в ядрах, производных от NT, которые не имеют простого аналога в системах Unixy, такие как объекты событий и перекрывающийся ввод-вывод.
Как бы то ни было, в некоторых системах Unixy есть расширения для простых старых сокетов BSD, например, aio_*()
в Solaris и других системах.
Если ваша программа должна быть совместима с исходным кодом со многими системами, вы либо игнорируете эти различия и программируете на общей базе, общей для всех этих систем, либо вы создаете какой-то уровень трансляции, который позволяет вам прозрачно использовать функции платформы. Например, Apache делает последнее, используя самые быстрые сетевые функции на каждой платформе, в то время как основной код веб-сервера не заботится о том, как именно работает сеть. Многие другие программы выбирают переносимый путь, поскольку они не критичны к производительности, и поэтому более важна экономия времени программиста.
Когда люди говорят «Сетевое программирование на C» / «Программирование сокетов», что именно они имеют в виду?
Сокеты BSD или какой-то другой вариант.
Ссылки для получения дополнительной информации?
Часто задаваемые вопросы программиста Winsock. В частности, вы можете просмотреть его раздел ресурсы и статью часто задаваемых вопросов Совместимость с сокетами BSD.
(Отказ от ответственности: я сопровождаю FAQ.)
person
Warren Young
schedule
16.01.2010