Что такое SOCK_DGRAM и SOCK_STREAM?

Я только что натолкнулся на эту странную вещь, которую я увидел в приложении, это то, что по умолчанию они используют функцию SOCK_STREAM. Почему это так? Это SOCK_STREAM просто создает несколько потоков? Или это стандартная функция SOCK_STREAM доступная для создания потоков TCP?

Я думал, что цунами основано на UDP, но все еще имеет некоторые особенности, такие как TCP, например, справедливость TCP, дружелюбие и т.д.

Может ли кто-нибудь пролить свет на этот вопрос? Я полностью смущен этим.

Ответы

Ответ 1

TCP почти всегда использует SOCK_STREAM а UDP использует SOCK_DGRAM.

TCP (SOCK_STREAM) - это протокол, основанный на соединении. Соединение установлено, и обе стороны ведут разговор до тех пор, пока соединение не будет прервано одной из сторон или сетевой ошибкой.

UDP (SOCK_DGRAM) - это протокол на основе дейтаграмм. Вы отправляете одну дейтаграмму и получаете один ответ, а затем соединение разрывается.

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

  • Если пакет TCP потерян, отправитель может сказать. Не так для UDP.

  • UDP датаграммы ограничены по размеру, из памяти я думаю, что это 512 байт. TCP может отправлять гораздо большие комки, чем это.

  • TCP немного более устойчив и делает больше проверок. UDP имеет меньший вес (меньше нагрузки на компьютер и сеть).

Выберите протокол, соответствующий тому, как вы хотите взаимодействовать с другим компьютером.

Ответ 2

Обновление: мой ответ кажется более актуальным, но исходный вопрос относится к UDT, который является протоколом, ориентированным на соединение, построенным поверх UDP. Подробнее здесь: http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDT, похоже, предоставляет API, который имитирует классический API сокетов BSD, поэтому его можно использовать как замену для приложений как для потоков, так и для дейтаграмм. Проверьте, например. sendmsg и recvmsg - оба генерируют исключение, если они используются в сокете, созданном с помощью SOCK_STREAM, и все поточно-ориентированные API генерируют исключение для сокета, созданного с помощью SOCK_DGRAM.

В случае SOCK_DGRAM он выполняет некоторую дополнительную обработку, однако он не просто прозрачно изолирует ящик UDP в таком случае - насколько я понимаю код после быстрого обзора (я не знаком с внутренними элементами UDT или спецификации протокола). Чтение технических документов могло бы помочь много.

Библиотека всегда создает свой основной "реальный" сокет в качестве дейтаграммы (check channel.cpp, CChannel::open).