2013-05-21 17 views
5

Wie kann ich Haskell dazu bringen, auf demselben Port nach UDP und TCP zu lauschen? HierAbhören über TCP und UDP am selben Port

ist der Code, den ich bisher (basierend auf 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               
    )                  

ich kompiliert gut, aber ich habe den Folgelaufzeitfehler:

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

Leider Dokumentation Netzwerk-Programmierung in Haskell ist ein bisschen begrenzt (wie üblich). Ich weiß nicht genau, wo ich hinschauen soll, um das herauszufinden.

[UPDATE]
Für jemanden interessiert, hier ist das Ergebnis:

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

Ich weiß, es gibt viel Raum für Verbesserungen, aber es funktioniert.

+3

Besonderheiten Ihrer Einrichtung wäre hilfreich. Ihr Code funktioniert gut für mich auf GHC 7.6.3 x86-64, Linux, mit Netzwerk 2.4.1.2. Auch der Jab auf Dokumentation ist unnötig - Netzwerk ist mäßig gut dokumentiert, ist weitgehend direkte C-Aufrufe, so dass die man-Seiten nützlich sind, und das Paket ist auf github, so dass Sie sich frei fühlen, Patches zu senden. –

Antwort

14

Es scheint nichts mit diesem Code falsch zu sein, aber woanders scheint Ihr Code accept() auf dem UDP-Socket aufzurufen, was nicht legal ist. Alles, was Sie mit einem UDP-Socket tun müssen, erhalten Sie von ihm und senden Sie mit ihm.

Verwandte Themen