如何让 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
我意识到还有很大的改进空间,但它确实有效。