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

Discussion in 'WASM.WIN32' started by Andrey333, Jan 30, 2020.

  1. Andrey333

    Andrey333 Member

    Blog Posts:
    0
    Здравствуйте!

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

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Andrey333,

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

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

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

    Andrey333 Member

    Blog Posts:
    0
    Я имел ввиду named pipes. Они могут работать по сети.
    Предпочел пайпы, т. к. они позволяют настроить права доступа, в отличии от сокетов.

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Andrey333,

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

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

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

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

    sn0w Active Member

    Blog Posts:
    0
    есть Mojo(IPC-двигло) как компонент того же Chrome и Chromium - там разумеется и исходники, в частности под винду.
     
    Last edited by a moderator: Feb 12, 2020
  6. Andrey333

    Andrey333 Member

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Andrey333,

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