2015-07-13 2 views
0

Я написал очень простой код для настройки «сервера», который создает именованный канал и ждет подключения клиента. Как только клиент открывает канал, сервер отправляет свои данные (блок размером около 10 мб), и клиент должен его прочитать и закрыть соединение.Именованные каналы по сети

Настоящий улов теперь: когда труба работает с локальными именами (\. \ Pipe \ xxx), он отправляет все данные без каких-либо проблем, но если я изменю путь к сетевому имени (\ computer \ pipe \ xxx) он изменяет поведение, и клиент может читать только около 65000 ~ байтов, но он не завершает операцию чтения, даже если я его зацикливаю (я предполагаю, что он разбивается на 65k блоков для отправки по сети, так как я использую имя сети, это происходит даже локально). ReadFile читает блок 65k и возвращает TRUE, если я пытаюсь снова заставить ReadFile в трубе читать 0 байт.

Флагов, которые я использую для создания труб являются PIPE_ACCESS_DUPLEX, FILE_FLAG_WRITE_THROUGH, PIPE_TYPE_BYTE, PIPE_READMODE_BYTE, PIPE_WAIT, PIPE_ACCEPT_REMOTE_CLIENTS

Вот часть того, что код должен выглядеть (код где-то еще, и я могу «т получить доступ к нему прямо сейчас, но, как я уже говорил, это так же просто, как он получает)

lPipe := CreateFileA('\\.\pipe\test', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); 
ReadFile(lPipe, lMemoryStream.Memory^, 1024*1024*15, lBytesRead, nil); 
CloseHandle(lPipe); 
+0

Если вы ожидаете получить помощь с кодом, вам необходимо включить код в свой вопрос. Пожалуйста, отредактируйте вопрос] (http://stackoverflow.com/posts/31395015/edit), чтобы показать свой код чтения. –

+0

Я надеялся избежать кода, потому что он сузил бы ответы, я думаю. В настоящее время я использую delphi 7, и код действительно прост, так же просто, как CreateFile-> ReadFile-> CloseHandle, но я добавлю его в сообщение, чтобы дать лучшую картинку. –

ответ

4

от MSDN documentation for WriteFileEx:

Pipe write operations across a network are limited to 65,535 bytes per write. For more information regarding pipes, see the Remarks section. 

Чтобы пройти мимо этого, вам нужно будет настроить сервер для отправки данных в куски.

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