【问题标题】:Asynchronous UDP server/client as base for IPC in Haskell异步 UDP 服务器/客户端作为 Haskell 中 IPC 的基础
【发布时间】: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 ()

【问题讨论】:

标签: haskell udp messaging


【解决方案1】:

【讨论】:

  • 我确实相信信使。正如 DCCP RFC 4340 中所述,我们认为不可靠的一切可能都是(在现代网络中)拥塞控制不足的结果。
  • @JFritsch 如果您预计可能会丢失一个数据包,那么您就不信任该信使。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多