2017-09-17 5 views
0

それがGio.DataInputStreamでファイル記述子だラップすることにより、Gio.Socketから読み取ることが可能ですがcommented hereとしてので、受信するGJSでGio.Socket.receive_from()を使用することはできません。UDPリスナーソケットの受信メッセージからリモートアドレスを取得するにはどうすればよいですか?

GJSはに渡す前に配列引数のクローンを作成しますSocket.receive_fromの呼び出しを行い、受け取ったバイト数とパケットのソースを返すCコード。バッファの内容は変更されません。実際に読み込まれるバッファは解放されたクローンです。

したがって、入力引数がクローン化され、データは、に書き込まれるバッファではなく、実際に渡さbufferのインスタンスをクローニングした。

をデータストリームから読み出しても問題はないが、Gio.Socket.receive_from()れますGio.Socket.remote_addressは定義されていないので、UDPリスナーからリモートアドレスを取得する唯一の方法です。残念ながら、ドキュメントがGio.Socket.receive()のために言うように:​​については

[...]受信したメッセージがbufferに収まるには大きすぎる場合には、sizeバイトを超えるデータはこれが持っている任意の明示せず、破棄されます発生した。

だから私はちょうどアドレスを取得するためにGio.Socket.receive_from(new Uint8Array(0), null);ような何かをしようとした場合、パケットが飲み込まれるが、私は、ファイル・ディスクリプタ経由で読み込む場合は、メッセージがどこから来た私が言うことができません。パケットの受信アドレスを取得する別の非破壊的な方法はありますか?

+0

なぜデータグラムを複製すると、そのソースを取得できないのですか? – EJP

+0

申し訳ありませんが、引用したコメントは完全にはっきりしていません。 'GioSource.receive_from(buffer、cancellable)'でアドレスを取得することができます(GJSでは '[size、address]'の配列を返します)。しかし、GJSのクローンでは 'buffer 'で渡されたargsにnoそれに書き込まれたデータ。したがって、 'Uint8Array(4096)'を渡すと、データは元のデータではなくクローンされたargに書き込まれているので、 'buffer 'は4KBのヌルバイトで埋められます。 –

+0

私は少し質問を明確にしました。 –

答えて

1

データグラムソケットを使用しているので、Gio.Socket.receive_message()を使用し、Gio.SocketMsgFlags.PEEKフラグを渡す必要があります。これはストリームベースのソケットでは不可能ですが、その場合は読み取りごとに送信者アドレスを必要としません。

パフォーマンスを向上させたい場合は、Gio.Socket.receive_messages()を使用することができますが、現時点では完全にイントロスペクトなのかどうかはわかりません。

+0

優秀、そうです!私はこのことについてほとんど希望をあきらめていた。 –

関連する問題