Чтение сокета UDP: записи или поток - PullRequest
1 голос
/ 15 декабря 2011

Предположим, что отправитель UDP выполняет sendto несколько раз:

sendto(s, buffer, 100, ...);
sendto(s, buffer, 200, ...);
sendto(s, buffer, 300, ...);

Получатель выполняет следующий код при наличии данных:

void OnReceive()
{
    recvfrom(s, buffer, 1000, ...);
}

Теперь, если все данные (100 + 200)+300) доступно при вызове recvfrom, возможно ли, что он будет прочитан одним вызовом recvfrom или несколькими вызовами recvfrom с непредсказуемыми размерами?Или он всегда будет приниматься теми же порциями, что и отправленный: 100, 200, 300?

Чтобы написать 100% правильный код получателя, должен ли я реализовать своего рода логику анализа потока или логику чтения записей данных?

В этом вопросе я предполагаю, что данные не теряются и порядок пакетов не изменяется, хотя в общем случае это неверно для UDP-сокетов.

1 Ответ

2 голосов
/ 15 декабря 2011

Одна операция чтения из UDP-сокета исключает из очереди одну дейтаграмму независимо от того, сколько в очереди (исключение составляет новый специфичный для Linux recvmmsg(2) API), то есть предполагается, что пакеты не переупорядочены и буферы, которые вы предоставляетеядро достаточно большое, вы получите 100, 200 и 300 байт за три чтения.

Приложения UDP обычно ориентированы на запись.

...