Почему для этого нет стандарта?
Фактическим стандартом являются сокеты 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 розетки или какой-то другой вариант.
Ссылки для получения дополнительной информации?
FAQ программиста Winsock . В частности, вы можете обратиться к разделу resources и статье часто задаваемых вопросов Совместимость с сокетами BSD .
(Отказ от ответственности: я сопровождающий FAQ.)