gpt4 book ai didi

sockets - Haskell 中的非阻塞 UDP 接收

转载 作者:行者123 更新时间:2023-12-02 14:41:06 25 4
gpt4 key购买 nike

我仍在学习 Haskell 的基础知识,目前正在将一些 Java 代码移植到 Haskell。我当前的问题是使用 Network.Socket.ByteString 进行 UDP recvFrom。

问题出在 this method :

public abstract SocketAddress receive(ByteBuffer dst) throws IOException

Receives a datagram via this channel.
If a datagram is immediately available, or if this channel
is in blocking mode and one eventually becomes available,
then the datagram is copied into the given byte buffer and
its source address is returned. If this channel is in
non-blocking mode and a datagram is not immediately available
then this method immediately returns null.

问题是,当我使用 Network.Socket.ByteString.recvFrom 时我的代码此时阻塞等待数据包的到来。它不会返回类似 Maybe 的内容来指示是否收到某些内容(与 Java 中的方式相同,当没有可用数据时返回 null)

我找到了这个帖子:https://mail.haskell.org/pipermail/haskell-cafe/2010-August/082725.html

最后,建议了几种方法:1)FFI 2)在自己的线程中运行recvFrom

我不确定我现在是否有能力使用这些方法中的任何一种(知识不足)。我想要的是得到类似于Java非阻塞接收方式的东西:如果可用则获取所需的信息,或者如果没有单个UDP数据包则什么也没有。任何人都可以指出什么是更好的方法,任何代码片段,有人已经处理了这个问题?

最佳答案

您可以使用socketToHandlehGetNonBlocking 一起:

recvNonBlocking :: Socket -> Int -> IO ByteString
recvNonBlocking s n = do
hnd <- socketToHandle s ReadMode
hGetNonBlocking hnd n

但是,请记住,在调用 socketToHandle 之后,您无法使用 Socket,因此只有在之后以任何一种方式关闭 Socket 时,这才可行。

关于sockets - Haskell 中的非阻塞 UDP 接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com