我想在Haskell中汇总异步UDP IPC的基础知识。为此,发送者/接收者应该发出例如同步接收(或发送,取决于你查看它的哪一方)线程并继续执行其他任务。
这可能涉及定义一个新的数据类型,该数据类型由可选的消息/数据序列号和某种缓冲区组成,这样当发送线程从接收方收到无法应对速度的通知时,发送线程就可以停止发送。
我的目标是使其重量轻,重量轻。尽可能异步。
我尝试了很多东西,例如为每个数据包启动一个新的接收线程(从一篇关于多玩家在线游戏的论文中采用这种方法),但这几乎使所有事情都停止了。
以下是我无辜的首次采取此行动。任何帮助,例如在Haskell中创建缓冲区,创建序列号或DCCP实现(我找不到)。 - 我不想讨论有关UDP与TCP等的见解。
一旦某些内容不同步,我的代码段就会停止工作,例如当没有数据到达时或者数据到达的数量少于预期时。我正在寻找一些轻量级(轻量级:D)在发送和接收线程之间同步的方式,例如这样。
main = withSocketsDo $ do
s <- socket AF_INET Datagram defaultProtocol
hostAddr <- inet_addr host
done <- newEmptyMVar
let p = B.pack "ping"
thread <- forkIO $ receiveMessages s done
forM_ [0 .. 10000] $ \i -> do
sendAllTo s (B.pack "ping") (SockAddrInet port hostAddr)
takeMVar done
killThread thread
sClose s
return()
receiveMessages :: Socket -> MVar () -> IO ()
receiveMessages socket done = do
forM_ [0 .. 10000] $ \i -> do
r <- recvFrom socket 1024
print (r) --this is a placeholder to make the fun complete
putMVar done ()