неблокирование udp программирование сокета в C: что я получаю?

У меня есть проблема в понимании, что recv ()/recvfrom () возвращают из non-blockig сокета UDP.

Немного более конкретный и по сравнению с TCP (исправьте меня, если я неправ):

  • Блокирующийся сокет (или TCP или UDP) не возвратится из recv (), пока не будут некоторые данные в буфере. Это могло быть некоторым числом байтов (TCP) или полная датаграмма (UDP).

  • Не блокирующийся сокет TCP или возвращает EWOULDBLOCK (Linux) / WSAEWOULDBLOCK (окна) или байты, которые в настоящее время находятся в буфере. Поскольку данные TCP являются потоком, не имеет значения, сколько байтов возвращается.

Теперь вопрос:

  • Не блокирующийся сокет UDP также возвращает WOULDBLOCK (Linux) / WSAEWOULDBLOCK (окна), при отсутствии доступных данных. Но если существуют данные availabe, не блокирующийся UDP снабжает возврат сокетом просто некоторые байты, которые могли означать, что Вы только получаете половину датаграммы, ИЛИ UDP всегда снабжает сокетом возврат полные датаграммы??

Править:

То, что я имею в виду с "половиной датаграммы": что происходит, если я называю recv () в только момент, когда сокет в настоящее время получает датаграмму. В тот момент существуют некоторые байты в буфере, но датаграмма еще не завершена.

Ваши объяснения и комментарии ценятся.Спасибо!

8
задан knocte 18 March 2013 в 21:51
поделиться

3 ответа

Наконец-то появился повод откопать мои книги Стивенса из старых офисных коробок.

При условии, что буфер достаточно большой, стандартные функции сокетов Беркли recv() и recvfrom() никогда не возвращают неполную дейтаграмму. Дейтаграмма недоступна приложению, пока ядро полностью не получит и не соберет дейтаграмму.

Интересно, что сегодня это не является большой (какой-либо?) проблемой, другие интерфейсы сетевого программирования не согласны с поведением, когда предоставляемый буфер слишком мал:

Традиционная версия API сокетов Беркли усекает дейтаграмму, отбрасывая лишние данные. Уведомление приложения зависит от версии. (4.3BSD Reno и более поздние версии могут уведомлять приложение о том, что датаграмма была усечена.)

API сокетов под SVR4 (включая Solaris 2.x) не усекает датаграмму. Любые избыточные данные возвращаются при последующих чтениях. Приложение не уведомляется о том, что выполняется несколько чтений из одной дейтаграммы UDP.

API TLI не отбрасывает данные. Вместо этого возвращается флаг, указывающий на то, что доступно больше данных, и последующие чтения приложением возвращают остальную часть дейтаграммы.

(Stevens, TCP/IP Illustrated, Volume 1, p. 160)

8
ответ дан 5 December 2019 в 18:59
поделиться

Фоновый поток (объект Thread имеет свойство Background , набор true ) не препятствует выходу из приложения.

После завершения всех обычных (основных) потоков все выполняющиеся фоновые потоки немедленно завершаются. Кроме того, если AppDomain выгружен, все фоновые потоки в AppDomain немедленно прерываются.

Потоки, управляемые ThreadPool , являются фоновыми потоками.

Поток переднего плана является обычным потоком.

Основным потоком является начальный поток, который запустил программу. (Поток, выполняющий метод Main )

Для получения дополнительной информации см. здесь .

-121--3348321-

HTML-таблица? Например, все содержимое < td > в двухмерном массиве?

var tbl = $('table#whatever tr').map(function() {
  return $(this).find('td').map(function() {
    return $(this).html();
  }).get();
}).get();

Тогда просто используйте $ .json (или любую нужную библиотеку), чтобы превратить его в последовательность JSON.

edit - перезаписано для использования собственного ( shim here ) .map () из прототипа массива:

var tbl = $('table#whatever tr').get().map(function(row) {
  return $(row).find('td').get().map(function(cell) {
    return $(cell).html();
  });
});

Функция jQuery .map () имеет «функцию» сведения возвращенных массивов в результирующий массив. То есть, если функция обратного вызова возвращает значение, которое само по себе является массивом, то вместо того, чтобы возвращенный массив стал значением одной ячейки результата .map () , каждый его элемент добавляется к результату.

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

-121--2118702-

Я полагаю, что вы получите точно одну или ноль датаграмм. Но я не могу поддержать это в данный момент. Возможно, кто-то другой мог бы предоставить хорошую справку?

Edit: Я почти уверен, что вы не можете получить половину дейтаграммы. Либо датаграмма поступила в буфер in, либо нет.

0
ответ дан 5 December 2019 в 18:59
поделиться

Это лямбда-выражение. http://msdn.microsoft.com/en-us/library/bb397687.aspx Похоже, это выбор всех путешественников, которые имеют любой маршрут путешествия в «F», который предположительно является страной.

-121--4859504-

Ниже приведены общие рекомендации:

Методы для поддержки:

  1. Используются для стандартизации разметки. Я использую помощники, чтобы убедиться, что поля формы, кнопки ввода и тэги изображения используют последовательную разметку.
  2. Используется, когда результирующая разметка минимальна. Небольшие биты текста, разметка поля формы и т.д. Я не использую помощники для визуализации объектов полного домена.
  3. Работа с небольшим количеством дискретных аргументов. Если мне нужно выполнить итерацию над коллекцией и показать что-то, это частичная часть. Если мне нужно взять большое количество входных данных, это тоже частично.
  4. Не содержат никакой бизнес-логики, только логики представления. Аргументы обычно являются объектами в домене решения, а не в бизнес-домене/домене проблемы.
  5. Обычно очень общие по объему и применяются к большим частям приложения.

Визуализация частичная:

  1. Используется, когда я хочу разложить большой вид на более мелкие части. Модель должна быть подмножеством модели «основного» вида.
  2. Частичные представления часто используются только определенными контроллерами или областями.

Действие визуализации:

  1. Используется, когда требуется создать небольшие фрагменты функциональности , которые могут быть составлены различными способами.
  2. Чаще всего используется для создания содержимого, которое применяется ко многим контроллерам или областям, таким как элементы управления навигацией.

ViewData:

Я буду использовать ViewData для отслеживания глобальных данных, которые применяются ко всем представлениям, таким как текущий пользователь. Если мне нужен согласованный способ отображения этих данных, я обычно создаю для них частичную часть, а затем выполняю функцию RenderPartial () на странице-шаблоне.

-121--3095711-

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

Яркая сторона этого заключается в том, что вы можете получить ощущение отдельных передач, что не очень легко сделать с TCP.

1
ответ дан 5 December 2019 в 18:59
поделиться