ksa*_*jev 7 sockets networking haskell udp nonblocking
我还在学习Haskell的基础知识,目前正在将一些Java代码移植到Haskell.我目前的问题是使用Network.Socket.ByteString的UDP recvFrom.
问题在于这种方法:
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.
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用Network.Socket.ByteString.recvFrom时,我的代码块会在此时等待数据包到来.它不会返回类似于Maybe的内容来指示是否收到了某些内容(在Java中,当没有数据可用时返回null时)
我找到了这个帖子:https://mail.haskell.org/pipermail/haskell-cafe/2010-August/082725.html
最后提出了几种方法:1)FFI 2)在自己的线程中运行recvFrom
我不确定此刻我是否能够使用这些方法(知识不够).我想要的是获得类似于Java的非阻塞接收方式:如果可用则获取所需信息,或者如果没有单个UDP数据包则不需要.任何人都可以指出什么是更好的方法,任何代码片段,有人已经处理过这个问题?
您可以socketToHandle
与以下一起使用hGetNonBlocking
:
recvNonBlocking :: Socket -> Int -> IO ByteString
recvNonBlocking s n = do
hnd <- socketToHandle s ReadMode
hGetNonBlocking hnd n
Run Code Online (Sandbox Code Playgroud)
但是,请记住,您无法Socket
在调用 后使用socketToHandle
,因此只有在之后以任何一种方式关闭 Socket 时,这才可行。