0

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);获取地址之类的方法,则数据包被吞下,但如果我通过文件描述符读取,我无法判断消息来自何处。是否有另一种非破坏性方法来获取数据包的传入地址?

4

1 回答 1

1

由于您使用的是数据报套接字,因此应该可以使用Gio.Socket.receive_message()并将Gio.SocketMsgFlags.PEEK标志传递给它。这对于基于流的套接字是不可能的,但是在这种情况下,您不会想要每次读取的发送者地址。

如果您想提高性能,您可以使用Gio.Socket.receive_messages(),尽管我不确定目前这是否完全可自省。

于 2017-09-18T10:28:31.370 回答