2012-03-26 3 views
0

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

~ Майкл

ответ

1

Я использую макрос так:

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

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

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

файлов заголовки и VAPI файл с именем «фокусы» являются in my GitHub. Существуют аналогичные версии для работы с массивами объектов.

+0

Спасибо :) Я попробую. Однако нет способа сделать все это через Валу? Я имею в виду, я не возражаю против использования заголовка, так как на самом деле я действительно использую этот код. Мне просто интересно, можно ли это сделать без необходимости кода C :) –

1
unowned uint8[] buf = (uint8[]) your_real_buffer; 
buf.length = the_length_you_want; 

Затем отправьте сообщение buf.