Будет ли Socket.Receive (byte []) возвращать ровно один пакет UDP? - PullRequest
1 голос
/ 11 марта 2012

У меня есть такая розетка:

s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

Правильно ли я тогда, когда я звоню

s.Receive(byte[]);

Я получаю ровно одну дейтаграмму? Мне нужно обрабатывать дейтаграммы одну за другой.

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Будет возвращено не более одного UDP-пакета.(Если учесть, что исключение приводит к тому, что «ничего не возвращается».)

В документации Socket.Recieve указано (в разделе замечаний):

Если вы используете сокет без соединения, Receive будет читать first поставленную в очередь дейтаграмму с адреса получателя , указанного вами в методе Connect.

Однако обратите вниманиеследующее предложение:

Если датаграмма, которую вы получаете, больше, чем размер параметра буфера, буфер заполняется первой частью сообщения, лишние данные теряются и выдается исключение SocketException.

Вызов также может вызвать исключение по тайм-ауту или при отсутствии данных в неблокирующем режиме и т. Д.

Счастливое кодирование.

1 голос
/ 11 марта 2012

Да, вы будете.Специфика UDP, которая делает это возможным, известна как Message Boundary Preservation.

Если под one by one вы подразумеваете, надежно и в порядке , вы должны иметь вИмейте ввиду, что UDP тоже не гарантирует.Пожалуйста, обратитесь эта статья для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...