2013-05-21 82 views
5

如何讓Haskell偵聽同一端口上的UDP和TCP?在同一端口上偵聽TCP和UDP

這是我迄今(基於ACME-HTTP)的代碼:

listenOn portm = do                
    protoTCP <- getProtocolNumber "tcp"           
    E.bracketOnError                
    (socket AF_INET Stream protoTCP)           
    sClose                 
    (\sock -> do                
     setSocketOption sock ReuseAddr 1          
     setSocketOption sock NoDelay 1          
     bindSocket sock (SockAddrInet (fromIntegral portm) iNADDR_ANY)   
     listen sock (max 1024 maxListenQueue)        
     return sock               
    )                  
    protoUDP <- getProtocolNumber "udp"           
    E.bracketOnError                
    (socket AF_INET Datagram protoUDP)          
    sClose                 
    (\sock -> do                
     setSocketOption sock ReuseAddr 1          
     bindSocket sock (SockAddrInet (fromIntegral portm) iNADDR_ANY)   
     return sock               
    )                  

我編譯好,但我得到後續運行時錯誤:在

user error (accept: can't perform accept on socket ((AF_INET,Datagram,17)) in status Bound) 

不幸的是,文件Haskell中的網絡編程有點有限(像往常一樣)。我真的不知道我應該在哪裏找出這些東西。

[更新]
對於任何人有興趣,這裏是結果:

https://github.com/joehillen/acme-sip/blob/master/Acme/Serve.hs

我知道有很多需要改進的地方,但它的作品。

+3

您的設置細節將有所幫助。您的代碼在GHC 7.6.3 x86-64,Linux上使用網絡2.4.1.2適合我。此外,對文檔的刺戳是不必要的 - 網絡文檔適中,主要是直接C調用,因此man手冊頁很實用,並且該軟件包位於github上,因此您可以隨時發送補丁。 –

回答

14

此代碼似乎沒有任何問題,但是您的代碼似乎在其他地方正在調用UDP套接字上的accept(),這是不合法的。你需要做一個UDP套接字的工作就是從它接收並與它一起發送。