Gio.Socket
虽然可以通过将它的文件描述符包装在中来读取 a ,但在 GJSGio.DataInputStream
中使用接收是不可能的,因为正如这里评论的那样:Gio.Socket.receive_from()
GJS 将在将数组参数传递给 C 代码之前克隆它们,这将使对 Socket.receive_from 的调用起作用并返回接收到的字节数以及数据包的来源。缓冲区内容将保持不变,因为实际读入的缓冲区是一个已释放的克隆。
因此,输入参数被克隆,数据将被写入克隆的缓冲区,而不是buffer
实际传入的实例。
尽管从数据流中读取不是问题,但这是Gio.Socket.receive_from()
我能找到的从 UDP 侦听器获取远程地址的唯一方法,因为Gio.Socket.remote_address
它是未定义的。不幸的是,正如文档所说Gio.Socket.receive()
:
对于
G_SOCKET_TYPE_DATAGRAM
[...] 如果接收到的消息太大而无法放入buffer
,则超出size
字节的数据将被丢弃,而没有任何明确指示已发生这种情况。
因此,如果我尝试Gio.Socket.receive_from(new Uint8Array(0), null);
获取地址之类的方法,则数据包被吞下,但如果我通过文件描述符读取,我无法判断消息来自何处。是否有另一种非破坏性方法来获取数据包的传入地址?