Создание надежного UDP с помощью функции сокета в c - PullRequest
2 голосов
/ 05 марта 2011

У меня есть такое сомнение в программировании сокетов, которое я не мог очистить, читая справочные страницы.

В c объявление функции сокета равно int socket(int domain, int type, int protocol);

Справочная страница linux сообщает, что, хотя type решает, что поток, который будет сопровождаться, номер протокола - это тот, который решает, следует ли протокол.

Таким образом, мой вопрос заключается в том, что предположим, что я задаю параметр типа как SOCK_STREAM, который является надежным, и добавлю номер протокола для UDP, если бы он дал мне надежный UDP, такой же, как TCP, но без контроля потока и контроля перегрузки.

К сожалению, я не могу проверить это, так как у меня одна машина, поэтому потери пакетов не происходит.

Может ли кто-нибудь прояснить это сомнение? Большое спасибо ...

Ответы [ 3 ]

3 голосов
/ 05 марта 2011

UDP нельзя сделать надежным. Передача пакетов осуществляется с максимальной эффективностью, но любой маршрутизатор / хост по всей цепочке может свободно отбрасывать пакет в мусоре и НЕ сообщать отправителю, что он это сделал.

Это не означает, что вы не можете навязать дополнительную семантику отправляющей и получающей сторонам, чтобы ожидать пакетов в течение определенного периода времени и сказать «эй, мы ничего не получили за последние X секунд». Но это не может быть сделано на уровне протокола. UDP - это протокол «выбросить его в исходящие и надеяться, что он туда попадет».

2 голосов
/ 05 марта 2011

Нет. Для стека протоколов IPV4 или IPV6 SOCK_STREAM получит вам TCP, а тип SOCK_DGRAM даст вам UDP. Параметр протокола не используется ни для одного из вариантов, и библиотека сокетов обычно ожидает, что там будет указано значение 0.

1 голос
/ 05 марта 2011

Если вы сделаете это:

socket(AF_INET,SOCK_STREAM,IPPROTO_UDP):

socket () вернет -1 и установит errno в

EPROTONOSUPPORT
          The protocol type or the specified protocol
          is not supported within    this domain.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...