Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Haskell中的非阻塞UDP recv_Sockets_Haskell_Networking_Udp_Nonblocking - Fatal编程技术网

Sockets Haskell中的非阻塞UDP recv

Sockets Haskell中的非阻塞UDP recv,sockets,haskell,networking,udp,nonblocking,Sockets,Haskell,Networking,Udp,Nonblocking,我仍在学习Haskell的基础知识,目前正在将一些Java代码移植到Haskell。我当前的问题是使用Network.Socket.ByteString的UDP recvFrom 问题在于: 问题是,当我在此时使用代码块等待数据包到来时。它不会返回类似于Maybe的内容来指示是否接收到了某些内容(与Java中没有可用数据时返回null的方式相同) 我发现了这个线索: 最后,建议使用两种方法:1)FFI 2)在自己的线程中运行recvFrom 我不确定我现在是否能够使用这些方法中的任何一种(没有足

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

问题在于:

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

我发现了这个线索:

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

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

您可以结合使用:

recvNonBlocking::Socket->Int->IO ByteString
recvnons n=do
hnd见;虽然我知道在港口期间进行重组可能会造成相当大的破坏性和危险。不过,从长远来看,在自己的线程上执行receive是正确的解决方案。当然,您可以以非阻塞的方式与单独的线程通信:在Windows上,使用除GHC以外的Haskell实现时,此函数无法正常工作;其行为与hGet相同。
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.
recvNonBlocking :: Socket -> Int -> IO ByteString
recvNonBlocking s n = do
     hnd <- socketToHandle s ReadMode 
     hGetNonBlocking hnd n