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
我知道有很多需要改進的地方,但它的作品。
您的設置細節將有所幫助。您的代碼在GHC 7.6.3 x86-64,Linux上使用網絡2.4.1.2適合我。此外,對文檔的刺戳是不必要的 - 網絡文檔適中,主要是直接C調用,因此man手冊頁很實用,並且該軟件包位於github上,因此您可以隨時發送補丁。 –