如何让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中网络编程的文档有点受限(像往常一样)。我真的不知道我应该在哪里找出这些东西。
[UPDATE]
对于任何有兴趣的人,结果如下:
https://github.com/joehillen/acme-sip/blob/master/Acme/Serve.hs
我意识到还有很大的改进空间,但它确实有效。
答案 0 :(得分:14)
此代码似乎没有任何问题,但在其他地方,您的代码似乎在UDP套接字上调用accept()
,这是不合法的。您需要使用UDP套接字接收所有内容并随之发送。