Почему нет стандарта для этого?
Стандарт де-факто - это разъемы 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 гнезда или какой-либо вариант.
Ссылки для получения дополнительной информации?
The Winsock Programmer's FAQ. В частности, вы можете посмотреть его раздел resources и статью BSD Sockets Compatibility.
(Отказ от ответственности:. Я сопровождающий часто задаваемых вопросов)
Да, 4 разных имени фактически не означают 4 совершенно разных реализации. По крайней мере, с 3, о которых вы говорите, это почти то же самое с несколькими специфичными для платформы причудами. – Kylotan