如何从UDP侦听器套接字上的传入消息中获取远程地址?

时间:2017-09-17 08:08:35

标签: sockets udp gio gjs

虽然可以通过在Gio.Socket中包装文件描述符来从Gio.DataInputStream读取,但使用GJS 中的Gio.Socket.receive_from() 来接收是不可能的,因为commented here

  

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);之类的东西来获取地址,那么数据包就会被吞下,但如果我通过文件描述符读取,我就无法分辨出消息的来源。是否有另一种非破坏性的方法来获取数据包的传入地址?

1 个答案:

答案 0 :(得分:1)

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

如果你想提高性能,你可以使用Gio.Socket.receive_messages(),虽然我不确定目前是否完全内省。