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
改善の余地はたくさんあると思いますが、うまくいきます。