Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> беда сRandomAccessFile.writeInt, запись идет кусками 
:(
    Опции темы
_hunter
  Дата 16.8.2012, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: нет
Всего: 98



Добрый вечер,

Помогите со странной проблемой: пишу в pipe с помощью RandomAccessFile.writeInt:
RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\rmserverpipe", "rws");
pipe.writeInt(0xABCDEF12);
запись проходит "нормально" -- exception не бросается. Но "на другом конце" (читаю в "плюсах") из pipe'а вычитывается только один байт. Повторная "вычитка" дочитывает остальные три байта...

На чтении все банально:
result = ::ReadFile(pipe, &data, 4, &bytesRead, NULL);
и при "плюсовой" записи все вычитывается за один раз.

Соответственно вопрос: как "это" бороть?

С уважением...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
leniviy
Дата 16.8.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Я считаю, это норма. Даже если удастся побороть в данном случае, всё равно будет ненадежно. Так что надо ReadFile вызывать в цикле. И вообще инты надо передавать в network byte order.

Код

  u_long ul;
  int i;
  char *pdata = (char*)&ul;
  DWORD bytesRead, left = sizeof(u_long);
  while(left) {
    ReadFile(pipe, pdata, left, &bytesRead, NULL);
    /* проверка ошибки */
    left -= bytesRead;
    pdata+= bytesRead;
  }
  i = ntohl(ul);


Это сообщение отредактировал(а) leniviy - 16.8.2012, 22:06
PM MAIL   Вверх
_hunter
Дата 16.8.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: нет
Всего: 98



Как это "норма"? -- Справка:
http://docs.oracle.com/javase/1.4.2/docs/a...l#writeInt(int)
, вроде как, говорит что писаться должно четыре байта. Причем, почему-то, нет никаких механизмов контроля записи...

"Принимающее" приложение переписывать -- не вариант: оно уже работает и лезть туда никто не даст...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
leniviy
Дата 16.8.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(_hunter @  16.8.2012,  22:08 Найти цитируемый пост)
Вроде как, говорит что писаться должно четыре байта

Могу сделать предположение: жаба конвертит int в байт массив из 4 байт, меняет байты местами, и по-одному пишет в поток.
Винда успевает отправить первый байт, в это время буфер пайпа заполняется 3 оставшимися байтами.

Цитата(_hunter @  16.8.2012,  22:08 Найти цитируемый пост)
Причем, почему-то, нет никаких механизмов контроля записи...

Есть: IOException.

Цитата(_hunter @  16.8.2012,  22:08 Найти цитируемый пост)
оно уже работает и лезть туда никто не даст... 

баг в приложении.

Добавлено через 5 минут и 40 секунд
Во:
Код

    public final void writeInt(int v) throws IOException {
    write((v >>> 24) & 0xFF);
    write((v >>> 16) & 0xFF);
    write((v >>>  8) & 0xFF);
    write((v >>>  0) & 0xFF);
    //written += 4;
    }


Добавлено через 9 минут и 30 секунд
Попробуй так, но это из разряда ненадежных
Код

        byte[] bytes = { (byte)0xAB, (byte)0xCD, (byte)0xEF, (byte)0x12 };
        pipe.write(bytes);



Это сообщение отредактировал(а) leniviy - 16.8.2012, 22:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.