【发布时间】:2011-11-28 10:31:51
【问题描述】:
我想在 Haskell 中整理异步 UDP IPC 的基础知识。为此,发送方/接收方应发出例如同步接收(或发送,取决于您从哪一侧查看)线程并继续执行其他任务。
这可能涉及定义一种新的数据类型,该类型由可选的消息/数据序列号和某种缓冲区组成,以便发送线程在收到来自接收方的通知说它无法处理速度时可以停止发送。
我的目标是让它尽可能轻量级和异步。
我尝试了很多方法,例如为每个数据包启动一个新的接收线程(从一篇关于多人在线游戏的论文中采用这种方法),但这几乎让所有事情都陷入了停顿。
以下是我天真无邪的第一个看法。任何帮助,例如在 Haskell 中创建缓冲区、创建序列号或 DCCP 实现(我找不到)表示赞赏。 - 我不想参与关于 UDP 与 TCP 等的固执己见的讨论。
一旦某些东西不同步,我的 sn-p 就会停止工作,例如当没有更多数据到达或到达的数据少于预期时。我正在寻找发送和接收线程之间的某种轻量级(轻量级: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 ()
【问题讨论】:
-
恕我直言,你的 sn-p 并没有做任何你的文字所说的你想做的事情,也许我错过了什么?你在尝试做 RBUDP (scialert.net/fulltext/?doi=itj.2009.600.604)