\section{Socket Address}
A Socket Address is a pair of Host Address and Port Number. Together with a
Transport Protocol, it is sufficient information to address a network port on
any internet host.
\begin{code}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE Trustworthy #-}
module Network.Tox.NodeInfo.SocketAddress where
import Control.Applicative ((<$>), (<*>))
import Data.Binary (Binary, get, put)
import qualified Data.Binary.Bits.Get as Bits (runBitGet)
import qualified Data.Binary.Bits.Put as Bits (runBitPut)
import qualified Data.Binary.Get as Binary (Get)
import qualified Data.Binary.Put as Binary (Put)
import Data.MessagePack (MessagePack)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Network.Tox.Encoding (bitGet, bitPut)
import Network.Tox.NodeInfo.HostAddress (HostAddress (..))
import qualified Network.Tox.NodeInfo.HostAddress as HostAddress
import Network.Tox.NodeInfo.PortNumber (PortNumber)
import Network.Tox.NodeInfo.TransportProtocol (TransportProtocol)
import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)
data SocketAddress = SocketAddress HostAddress PortNumber
deriving (Eq, Ord, Show, Read, Generic, Typeable)
instance Binary SocketAddress
instance MessagePack SocketAddress
putSocketAddress :: TransportProtocol -> SocketAddress -> Binary.Put
putSocketAddress protocol (SocketAddress hostAddress portNumber) =
let (putAddressFamily, putHostAddress) = HostAddress.putHostAddress hostAddress in
do
Bits.runBitPut $ do
bitPut protocol
putAddressFamily
putHostAddress
put portNumber
getSocketAddress :: Binary.Get (TransportProtocol, SocketAddress)
getSocketAddress = do
(protocol, getHostAddress) <- Bits.runBitGet $ do
protocol <- bitGet
getHostAddress <- HostAddress.getHostAddressGetter
return (protocol, getHostAddress)
hostAddress <- getHostAddress
portNumber <- get
return (protocol, SocketAddress hostAddress portNumber)
instance Arbitrary SocketAddress where
arbitrary =
SocketAddress <$> arbitrary <*> arbitrary
\end{code}