From c9145e6b233e60186f1f29e762f2009d6bad73f8 Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan Date: Sat, 16 May 2015 22:11:22 +0530 Subject: [PATCH] convert bitfield from a peer into piece list --- src/FuncTorrent/Peer.hs | 30 ++++++++++++++++++++++++------ src/Main.hs | 2 +- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/FuncTorrent/Peer.hs b/src/FuncTorrent/Peer.hs index 8007ab0..93e4a15 100644 --- a/src/FuncTorrent/Peer.hs +++ b/src/FuncTorrent/Peer.hs @@ -5,18 +5,20 @@ module FuncTorrent.Peer msgLoop ) where -import Prelude hiding (lookup, concat, replicate, splitAt) +import Prelude hiding (lookup, concat, replicate, splitAt, empty) import System.IO import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton) import Data.ByteString.Lazy (fromStrict, fromChunks) -import qualified Data.ByteString.Char8 as BC (replicate, pack) +import qualified Data.ByteString.Char8 as BC (replicate, pack, length) import Network (connectTo, PortID(..)) import Data.Binary (Binary(..), decode) import Data.Binary.Put (putWord32be, putWord16be, putWord8) import Data.Binary.Get (getWord32be, getWord16be, getWord8, runGet) import Control.Monad (replicateM, liftM, forever) import Control.Applicative ((<$>), liftA3) +import Data.Bits +import Data.Word (Word8) type ID = String type IP = String @@ -146,10 +148,26 @@ getMsg h = do bsToInt :: ByteString -> Int bsToInt x = fromIntegral (runGet getWord32be (fromChunks (return x))) +bitfieldToList :: [Word8] -> Integer -> [Integer] +bitfieldToList [] pos = [] +bitfieldToList (b:bs) pos = + let setBits = [pos*8 + (toInteger i) | i <- [0..8], testBit b i] + in + setBits ++ (bitfieldToList bs (pos + 1)) + -- loop1 :: shake hands with all peers, find out the pieces they have, form PieceData. -- recvMsg :: Peer -> Handle -> Msg -msgLoop :: Handle -> IO () -msgLoop h = forever $ do - msg <- getMsg h - putStrLn $ "got a " ++ show msg +msgLoop :: Handle -> ByteString -> IO () +msgLoop h pieceHash = + let numPieces = (toInteger . (`quot` 20) . BC.length) pieceHash + in + forever $ do + msg <- getMsg h + putStrLn $ "got a " ++ show msg + case msg of + BitFieldMsg bss -> do + let pieceList = bitfieldToList (unpack bss) 0 + putStrLn (show pieceList) + -- doenload each of the piece + _ -> putStrLn (show msg) diff --git a/src/Main.hs b/src/Main.hs index afa0bd3..d92b9d1 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -66,7 +66,7 @@ main = do let p1 = head (peers peerResp) h <- handShake p1 (infoHash m) peerId log $ "handshake" - msgLoop h + msgLoop h (pieces (info m)) Left e -> log $ "Error" ++ unpack e Left e -> logError e log -- 2.37.2