2015-11-05 1 views
4

У Win32 раньше было ограничение размера сообщения в 64K для сообщений в режиме сообщений, о чем свидетельствуют остатки статьи KB Q119218 PRB: Named Pipe Write() Limited to 64K. В разделе «относится к» перечислены только «Интерфейс программирования Microsoft Win32», и статья довольно старая; нет никаких указаний на то, относится ли это также к разумно текущим версиям, таким как Windows 7. Существует ли какая-либо достоверная текущая информация о проблеме?Win32 именованные каналы и ограничения размера сообщений - старый лимит 64K по-прежнему применим?

В настоящее время онлайн-документация содержит только туманные намеки на неопределенных пределах, как эта красивая формулировками в документации для функции CreateNamedPipe():

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

Нет указаний на то, что может быть «системным максимумом», или как можно запросить его значение.

предел 64К вновь появляется в документации TransactNamedPipe():

Максимальный гарантированный размер именованного сделки трубы составляет 64 килобайт. В некоторых ограниченных случаях возможны транзакции более 64 килобайт, в зависимости от версий ОС, участвующих в транзакции и динамических сетевых условиях. Однако нет гарантии, что транзакции, превышающие 64 килобайта, будут успешными.

Однако вполне возможно, что предел применяется только к именованным трубам «транзакции» в смысле TransactNamedPipe(); то есть запись, за которой следует чтение, все завернутые в один системный вызов и/или сетевую транзакцию. Предел может быть связан с SMB и, следовательно, не применим к локальным трубам. Есть ли какая-то сложная информация об этом?

Трубы в режиме сообщений будут хорошо подходят для текущего проекта, когда серверные процессы получают питание пакета запроса и доставляют единый пакет ответов, причем диспетчер является простым многопоточным заглушкой, размещенной в Apache (аналогично mod_fcgid) , В байт-режимах потребуется немного дополнительного кадрирования, что делает трубы в режиме сообщений более простыми и, следовательно, предпочтительными. Однако невозможно ограничить размеры запросов и ответов до 64K; следовательно, этот вопрос.

ответ

3

Нет, таких ограничений больше нет.

documentation for WriteFile The говорит:

Windows Server 2003 и Windows XP: операции Pipe записи по сети ограничены в размерах на запись. Сумма зависит от каждой платформы. Для платформ x86 это 63,97 МБ. Для платформ x64 это 31,97 МБ. Для Itanium это 63,95 МБ.

Из этого можно заключить, что ограничение не распространяется на текущие версии Windows и, вероятно, применяется только к XP при работе с сетевым каналом.

Мы также можем заметить, что если Q119218 применим к текущим версиям Windows, он не был бы архивирован.

Экспериментально я могу подтвердить, что в Windows 7 с пакетом обновления 1 (SP1) x64 локальный канал сообщений может обрабатывать сообщения с большим размером гигабайта.(Я начал получать сообщения «недостаточно системных ресурсов» где-то около отметки 1650 МБ.)

+0

Спасибо, я так думал. Я выкопал несколько старых компакт-дисков и обнаружил, что статья KB Q119218 была создана в 1994-08-10; пересмотры, датированные между 1996-12-16 и 2000-10-18, применимы ли они к NT 3.1 - 4.0. Мой последний компакт-диск - в июле 2001 года, что является небольшим косвенным индикатором того, что Win2K и XP (тогда еще известные как Whistler) не пострадали. – DarthGizka

Смежные вопросы