From: Ramakrishnan Muthukrishnan Date: Wed, 6 May 2015 08:38:04 +0000 (+0530) Subject: read bytes off the handle and parse a message X-Git-Url: https://git.rkrishnan.org/components/%22news.html/frontends/%22file:/statistics?a=commitdiff_plain;h=8729f096fdd015825999db40d3077e95ecd0a370;p=functorrent.git read bytes off the handle and parse a message --- diff --git a/src/FuncTorrent/Peer.hs b/src/FuncTorrent/Peer.hs index c2268e8..29d5714 100644 --- a/src/FuncTorrent/Peer.hs +++ b/src/FuncTorrent/Peer.hs @@ -7,10 +7,11 @@ module FuncTorrent.Peer import Prelude hiding (lookup, concat, replicate, splitAt) import System.IO -import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton) -import qualified Data.ByteString.Char8 as BC (replicate, pack) +import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton, append) +import Data.ByteString.Lazy (fromStrict) +import qualified Data.ByteString.Char8 as BC (replicate, pack, readInt) import Network (connectTo, PortID(..)) -import Data.Binary (Binary(..)) +import Data.Binary (Binary(..), decode) import Data.Binary.Put (putWord32be, putWord16be, putWord8) import Data.Binary.Get (getWord32be, getWord16be, getWord8) import Control.Monad (replicateM, liftM) @@ -24,7 +25,7 @@ data PeerState = PeerState { handle :: Handle , am_choking :: Bool , am_interested :: Bool , peer_choking :: Bool - , peer_interested :: Bool } + , peer_interested :: Bool} -- Maintain info on every piece and the current state of it. -- should probably be a TVar. @@ -132,5 +133,13 @@ instance Binary PeerMsg where 9 -> liftM (PortMsg . fromIntegral) getWord16be _ -> error "unknown message ID" +getMsg :: Handle -> IO PeerMsg +getMsg h = do + lBS <- hGet h 4 + let (Just (l, _)) = BC.readInt lBS + msg <- hGet h l + return $ decode $ fromStrict $ append lBS msg + + -- loop1 :: shake hands with all peers, find out the pieces they have, form PieceData. -- recvMsg :: Peer -> Handle -> Msg