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 回答