+{-# LANGUAGE OverloadedStrings #-}
+module FuncTorrent.Server where
+
+import Control.Concurrent (forkIO)
+import Control.Monad (forever)
+import Network (withSocketsDo, listenOn, accept, Socket, PortID ( PortNumber ))
+import System.IO (hSetBuffering, BufferMode ( NoBuffering ))
+
+import FuncTorrent.Metainfo (Metainfo)
+import FuncTorrent.Peer (handlePeerMsgs, Peer(..))
+
+-- server is listening on any port from 6881 - 6889
+-- return the port number used
+start :: IO (Socket, PortID)
+start = withSocketsDo $ do
+ let portnums = [6881 .. 6889]
+ sock <- listenOn $ PortNumber $ fromIntegral (head portnums)
+ return (sock, PortNumber $ head portnums)
+
+run :: Socket -> String -> Metainfo -> IO ()
+run listenSock peerid m = forever $ do
+ (handle, ip, port) <- accept listenSock
+ let peer = Peer "" ip (fromIntegral port)
+ hSetBuffering handle NoBuffering
+ forkIO $ handlePeerMsgs peer peerid m