在同一端口上侦听TCP和UDP

Joe*_*and 5 haskell udp network-programming tcp

如何让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                                                         
    )                                                                       
Run Code Online (Sandbox Code Playgroud)

我编译得很好,但是我得到了跟随运行时错误:

user error (accept: can't perform accept on socket ((AF_INET,Datagram,17)) in status Bound)
Run Code Online (Sandbox Code Playgroud)

不幸的是,关于Haskell中网络编程的文档有点受限(像往常一样).我真的不知道我应该在哪里找出这些东西.

[更新]
任何人都有兴趣,这是结果:

https://github.com/joehillen/acme-sip/blob/master/Acme/Serve.hs

我意识到还有很大的改进空间,但它确实有效.

use*_*421 14

这段代码似乎没有任何问题,但在其他地方你的代码似乎是accept()在UDP套接字上调用,这是不合法的.您需要使用UDP套接字接收所有内容并随之发送.