Вопрос по именованным каналам

Тема в разделе "WASM.WIN32", создана пользователем Andrey333, 30 янв 2020.

  1. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    Здравствуйте!

    Возник вопрос касательно работы именованных каналов в локальной сети с асинхронным вводом-выводом.

    Допустим мы сделали запрос на чтение/запись 128 Кб данных. Может ли быть такое, что запрос завершится удачно, но данные будут прочитаны/записаны не все? Например GetOverlappedResult вернет TRUE, но в lpNumberOfBytesTransferred будет возвращено только 64 Кб. То есть потребуется дочитать/дописать данные.
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Andrey333,

    А что за каналы, сеть работает через драйверные запросы(IOCTL). Пайпы это тормозной механизм IPC(никто адекватный это не юзает), используется как RPC для того же межпроцессорного обмена данными. Но а сеть то причём, там ядерные запросы в соккетах.
    --- Сообщение объединено, 31 янв 2020 ---
    > Допустим мы сделали запрос на чтение/запись 128 Кб данных.

    Куда конкретно запись(посылка пакета I/O) ?

    ps: нужно видимо исходить что человек не понимает что спрашивает, 100k/s.. это обмен по rs232 :sarcastic_hand:
     
    Последнее редактирование: 31 янв 2020
  3. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    Я имел ввиду named pipes. Они могут работать по сети.
    Предпочел пайпы, т. к. они позволяют настроить права доступа, в отличии от сокетов.

    Например:
    1) Вызываем API ReadFile, в параметре nNumberOfBytesToRead передаем 128*1024
    2) Ждем на OVERLAPPED.hEvent
    3) Cобытие устанавливается в сигнальное состояние. Может ли быть так что в OVERLAPPED.InternalHigh < 128*1024, но при этом SUCCEEDED(OVERLAPPED.Internal) == TRUE?
     
    Последнее редактирование: 31 янв 2020
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Andrey333,

    Да, пайпы. Я про это сказал выше. Только небольшая опечатка как вижу, не межпроцессорного, а межпроцессного". Впрочем это ясно по контексту.

    > Cобытие устанавливается в сигнальное состояние. Может ли быть так что в OVERLAPPED.InternalHigh < 128*1024

    Кто его знает, так не делается. Это асинхронные ожидания, не вполне ясно как ос с ними работает. Обычно ожидание происходит в другом потоке на конкретном обьекте, но не в функции IO, как обратный вызов.

    Вероятно что манипулируя этим механизмом ты можешь подвесить поток ожидания. Лучше выбери явный механизм ожидания, пусть лучше будет второй поток, чем использован сомнительный механизм.
     
  5. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    есть Mojo(IPC-двигло) как компонент того же Chrome и Chromium - там разумеется и исходники, в частности под винду.
     
    Последнее редактирование модератором: 12 фев 2020
  6. Andrey333

    Andrey333 Member

    Публикаций:
    0
    Регистрация:
    30 янв 2020
    Сообщения:
    35
    Отвечаю сам на свой вопрос.
    Протестировал. Логи показали что такое возможно! Так что нужно учитывать.
    Да, ты прав. Я с этим как-то уже сталкивался. Только зачем второй поток? Ведь можно задать тайм-аут функции ожидания.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Andrey333,

    Завершить если зависнет. С файловым I/O оно вполне может :)