2011-11-28 99 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

謝謝。有趣的論文。 –

回答