在同一端口上侦听TCP和UDP

时间:2013-05-21 05:38:41

标签: haskell tcp network-programming udp

如何让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

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

1 个答案:

答案 0 :(得分:14)

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