2011-11-28 43 views
2

基地IPC我想把他们放在一起进行异步UDP IPC在Haskell的基础知识。为此,发送者/接收者应该例如发出一个同步接收(或发送,取决于你查看它的哪一侧)线程并继续执行其他任务。异步UDP服务器/客户端在哈斯克尔

这可能涉及到定义一个新的数据类型,它包含可选的消息/数据序列号和某种缓冲区,以便发送线程可以在接收方通知它无法应对速度时停止发送。

我的目标是使该轻重量&异步越好。

我已经尝试了一些东西,如启动一个新的接收线程为每个数据包(带从约多玩家在线游戏纸这种做法),但是这是粉碎几乎都停了下来。

下面是我的清白首先就这个。任何关于例如创建缓冲区,创建序列号或DCCP实现(我找不到)在Haskell赞赏。 - 我不希望陷入对UDP VS 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() 
+1

恕我直言,你的片段是不是附近做一个什么样的文字说,你想它待办事项什么,也许我失去了一些东西?你是否想要做RBUDP(http://scialert.net/fulltext/?doi=itj.2009.600.604) – Jonke

+0

谢谢。有趣的论文。 –

回答