5

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

改善の余地はたくさんあると思いますが、うまくいきます。

4

1 に答える 1

14

このコードに問題はないようですが、別の場所でコードがaccept()UDP ソケットを呼び出しているようで、これは合法ではありません。UDP ソケットで行う必要があるのは、ソケットから受信して送信することだけです。

于 2013-05-21T07:09:13.273 に答える