2013-05-21 35 views
5

Làm thế nào tôi có thể yêu cầu Haskell lắng nghe UDP và TCP trên cùng một cổng?Nghe trên TCP và UDP trên cùng một cổng

Đây là mã tôi đã cho đến nay (dựa trên 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               
    )                  

tôi biên dịch tốt, nhưng tôi nhận được lỗi runtime sau:

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

Thật không may, tài liệu về lập trình mạng trong Haskell là một chút hạn chế (như thường lệ). Tôi không thực sự biết nơi tôi phải nhìn để tìm ra công cụ này.

[UPDATE]
Đối với bất cứ ai quan tâm, đây là kết quả:

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

Tôi nhận ra có rất nhiều phòng để cải thiện, nhưng nó hoạt động.

+3

Các chi tiết cụ thể về thiết lập của bạn sẽ hữu ích. Mã của bạn hoạt động tốt cho tôi trên GHC 7.6.3 x86-64, Linux, sử dụng mạng 2.4.1.2. Ngoài ra, các jab trên tài liệu là không cần thiết - Mạng là vừa phải tài liệu, phần lớn là C cuộc gọi trực tiếp để các trang người đàn ông là hữu ích, và gói là trên github, do đó bạn có thể cảm thấy tự do để gửi các bản vá lỗi. –

Trả lời

14

Có vẻ như không có gì sai với mã này, nhưng ở một nơi khác mã của bạn có vẻ đang gọi accept() trên ổ cắm UDP, không hợp pháp. Tất cả những gì bạn cần làm với một ổ cắm UDP là nhận được từ nó và gửi với nó.

Các vấn đề liên quan