异步UDP服务器/客户端作为Haskell中IPC的基础

时间:2011-11-28 10:31:52

标签: haskell udp messaging

我想在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 ()