それが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);
ような何かをしようとした場合、パケットが飲み込まれるが、私は、ファイル・ディスクリプタ経由で読み込む場合は、メッセージがどこから来た私が言うことができません。パケットの受信アドレスを取得する別の非破壊的な方法はありますか?
なぜデータグラムを複製すると、そのソースを取得できないのですか? – EJP
申し訳ありませんが、引用したコメントは完全にはっきりしていません。 'GioSource.receive_from(buffer、cancellable)'でアドレスを取得することができます(GJSでは '[size、address]'の配列を返します)。しかし、GJSのクローンでは 'buffer 'で渡されたargsにnoそれに書き込まれたデータ。したがって、 'Uint8Array(4096)'を渡すと、データは元のデータではなくクローンされたargに書き込まれているので、 'buffer 'は4KBのヌルバイトで埋められます。 –
私は少し質問を明確にしました。 –