我该如何使Haskell监听同一个端口上的UDP和TCP?
这是我目前为止的代码(基于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
我意识到还有很大的改进空间,但它能工作。