2012-03-26 14 views
0

私は現在、Valaを使ってネットワークを介してデータを送信する必要があるアプリケーションを作成しています。パケットを作成するのを助けるために(そして、後の日付にプロトコルを更新するために)、メソッドにvoid *として渡す構造体を作成しました。これらの構造は、パケットがどのように配置されているかを表しており、あまり混乱させることなく、送信するパケットを非常に簡単に生成できます。しかし、この問題は、GLib.OutputStream.write()のValaラッパーが(元のメソッドであっても)カウントを受け入れないことです。 Valaは渡されたuint8 []のサイズを元のメソッドに渡します。これを回避する簡単な方法がありますか?GIO vapiを編集していますか?サイズを供給しながら、void *をuint8 []にキャストする、おそらく非常に安い方法でしょうか?私はアプリケーションが同時に何千もの接続を維持する必要があるので、ここでは非常に高いパフォーマンスを目指しています。助けを前にありがとう。ValaのGLib.OutputStreamにいくつかのバイトを書き込む

〜マイケル・

答えて

1

私はこのようなマクロを使用してきた。この問題を回避するには

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

。あなたのオブジェクトを取り、単にuint8[]と同じメモリを返します。それはValaの中に、対応するプロトタイプを持っている:

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

「トリック」と呼ばれるヘッダファイルとVAPIファイルがin my GitHubあります。オブジェクトの配列を処理するための類似のバージョンがあります。

+0

ありがとうございます:)私はこれらを試してみましょう。しかし、Valaを介してすべてを行う方法はありますか?つまり、ヘッダーを使用しても問題はありません。コードを使用するのは私だけです。私はちょうどそれがCコードの必要なしに行うことができますかと思います:) –

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

次にbufを送信します。

関連する問題