Что такое 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
).