Запись количества байтов в GLib.OutputStream в Vala - PullRequest
0 голосов
/ 26 марта 2012

В настоящее время я пишу приложение с использованием Vala, которое требует от меня отправки данных по сети.Чтобы помочь в создании пакетов (и обновлении протокола в более поздние сроки), я создал структуры, которые я передаю методу как void *.Эти структуры представляют, как устроен пакет, и позволяют мне очень легко сгенерировать пакет для отправки без необходимости слишком много возиться.Проблема с этим, однако, заключается в том, что оболочка Vala для GLib.OutputStream.write () не принимает счетчик (даже если это делает оригинальный метод).Vala берет размер переданного ему uint8 [] и передает его исходному методу.Есть ли простой способ обойти это, без редактирования GIO VAPI?Возможно, очень дешевый способ забросить пустоту * в uint8 [] при указании размера?Я стремлюсь к очень высокой производительности, так как приложение будет поддерживать одновременно тысячи соединений.Заранее спасибо за любую помощь.

~ Майкл

Ответы [ 2 ]

1 голос
/ 08 апреля 2012
unowned uint8[] buf = (uint8[]) your_real_buffer;
buf.length = the_length_you_want;

Затем отправьте buf. * ​​1002 *

1 голос
/ 26 марта 2012

Я использовал такой макрос:

#define OBJECT_TO_BUFFER(val,type,size) (*(size) = sizeof(type), (guint8*)val)

Чтобы обойти эту проблему. Он берет ваш объект и просто возвращает ту же память, что и uint8[]. Имеет соответствующий прототип в Вале:

unowned uint8[] Buffer.of<T>(ref T @value);

В моем GitHub заголовочные файлы и VAPI-файл, называемые «хитрости», . Существуют похожие версии для работы с массивами объектов.

...