У меня есть проблема в понимании, что recv ()/recvfrom () возвращают из non-blockig сокета UDP.
Немного более конкретный и по сравнению с TCP (исправьте меня, если я неправ):
Блокирующийся сокет (или TCP или UDP) не возвратится из recv (), пока не будут некоторые данные в буфере. Это могло быть некоторым числом байтов (TCP) или полная датаграмма (UDP).
Не блокирующийся сокет TCP или возвращает EWOULDBLOCK (Linux) / WSAEWOULDBLOCK (окна) или байты, которые в настоящее время находятся в буфере. Поскольку данные TCP являются потоком, не имеет значения, сколько байтов возвращается.
Теперь вопрос:
Править:
То, что я имею в виду с "половиной датаграммы": что происходит, если я называю recv () в только момент, когда сокет в настоящее время получает датаграмму. В тот момент существуют некоторые байты в буфере, но датаграмма еще не завершена.
Ваши объяснения и комментарии ценятся.Спасибо!
Наконец-то появился повод откопать мои книги Стивенса из старых офисных коробок.
При условии, что буфер достаточно большой, стандартные функции сокетов Беркли recv()
и recvfrom()
никогда не возвращают неполную дейтаграмму. Дейтаграмма недоступна приложению, пока ядро полностью не получит и не соберет дейтаграмму.
Интересно, что сегодня это не является большой (какой-либо?) проблемой, другие интерфейсы сетевого программирования не согласны с поведением, когда предоставляемый буфер слишком мал:
Традиционная версия API сокетов Беркли усекает дейтаграмму, отбрасывая лишние данные. Уведомление приложения зависит от версии. (4.3BSD Reno и более поздние версии могут уведомлять приложение о том, что датаграмма была усечена.)
API сокетов под SVR4 (включая Solaris 2.x) не усекает датаграмму. Любые избыточные данные возвращаются при последующих чтениях. Приложение не уведомляется о том, что выполняется несколько чтений из одной дейтаграммы UDP.
API TLI не отбрасывает данные. Вместо этого возвращается флаг, указывающий на то, что доступно больше данных, и последующие чтения приложением возвращают остальную часть дейтаграммы.
(Stevens, TCP/IP Illustrated, Volume 1, p. 160)
Фоновый поток (объект 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, либо нет.
Это лямбда-выражение. http://msdn.microsoft.com/en-us/library/bb397687.aspx Похоже, это выбор всех путешественников, которые имеют любой маршрут путешествия в «F», который предположительно является страной.
-121--4859504-Ниже приведены общие рекомендации:
Методы для поддержки:
Визуализация частичная:
Действие визуализации:
ViewData:
Я буду использовать ViewData для отслеживания глобальных данных, которые применяются ко всем представлениям, таким как текущий пользователь. Если мне нужен согласованный способ отображения этих данных, я обычно создаю для них частичную часть, а затем выполняю функцию RenderPartial () на странице-шаблоне.
-121--3095711-Да, UDP просто возвращает данные, переданные в одной дейтаграмме. UDP не ориентирован на поток, как TCP. Дейтаграммы являются дискретными передачами и не привязаны к другим дейтаграммам в любом пути. Именно поэтому параметр сокета для TCP является SOCK_STREAM.
Яркая сторона этого заключается в том, что вы можете получить ощущение отдельных передач, что не очень легко сделать с TCP.