2013-05-21 19 views
5

Haskell'in UDP ve TCP'yi aynı bağlantı noktasında dinlemesini nasıl sağlayabilirim? İşte TCP ve UDP'yi aynı bağlantı noktasında dinleme

şimdiye kadar (acme-http dayanarak) olan koddur: Ben iyi derler ama ben takip çalışma zamanı hatası almak

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               
    )                  

: on, maalesef belgelere

user error (accept: can't perform accept on socket ((AF_INET,Datagram,17)) in status Bound) 

Haskell'de ağ programlaması biraz sınırlıdır (her zamanki gibi). Bu şeyleri anlamak için nereye bakacağımı bilmiyorum.

[GÜNCELLEME] herkes için
burada, ilgilenen sonucudur:

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

Ben iyileştirilmesi için oda bir sürü var farkındayım ama işe yarıyor.

+3

Kurulumunuzun özellikleri size yardımcı olacaktır. Kodunuz ağ 2.4.1.2 kullanarak GHC 7.6.3 x86-64, Linux, benim için iyi çalışıyor. Ayrıca, belgelerin üzerinde jab gereksizdir - Ağ orta derecede iyi belgelenmiş, büyük ölçüde doğrudan C çağrılarıdır, bu yüzden adam sayfaları yararlıdır ve paket github üzerindedir, böylece yama göndermek için kendinizi özgür hissedebilirsiniz. –

cevap

14

Bu kodda yanlış bir şey yok gibi görünüyor, ancak başka bir yerde kodunuz UDP soketinde accept() numaralı telefonu arıyor gibi görünüyor. UDP soketi ile yapmanız gereken tek şey, ondan alır ve gönderir.