在同一端口上监听TCP和UDP

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

我意识到还有很大的改进空间,但它能工作。


3
您的设置具体信息将非常有帮助。您的代码在我的环境中运行良好,环境为 GHC 7.6.3 x86-64、Linux 平台,使用了 network 2.4.1.2。此外,关于文档的抨击是不必要的 - Network 的文档已经相当完善,并且大多数直接调用 C 函数,因此 man 页面会很有用。该软件包也在 github 上,您可以随意发送补丁。 - Thomas M. DuBuisson
1个回答

14

这段代码看起来没有什么问题,但是你的其他代码中似乎调用了UDP套接字上的accept()方法,这是不合法的。使用UDP套接字时只需从它接收和发送数据即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接