Guest User

Untitled

a guest
Oct 20th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. module Main where
  2.  
  3. import Network.Socket hiding (send, sendTo, recv, recvFrom)
  4. import Network.Socket.ByteString
  5. import Text.ProtocolBuffers.Header (uFromString)
  6. import Text.ProtocolBuffers.WireMessage (messagePut)
  7. import Data.ByteString as BS
  8. import Data.ByteString.Lazy as LBS
  9.  
  10. import Data.Sequence (fromList)
  11.  
  12. import AddressBookProtos.Person
  13. import AddressBookProtos.Person.PhoneNumber
  14. import AddressBookProtos.Person.PhoneType
  15.  
  16. opensocket :: HostName -> String -> IO (Socket, AddrInfo)
  17. opensocket hostname port =
  18. do -- Look up the hostname and port. Either raises an exception
  19. -- or returns a nonempty list. First element in that list
  20. -- is supposed to be the best option.
  21. addrinfos <- getAddrInfo Nothing (Just hostname) (Just port)
  22. let serveraddr = Prelude.head addrinfos
  23.  
  24. -- Establish a socket for communication
  25. sock <- socket (addrFamily serveraddr) Datagram defaultProtocol
  26.  
  27. -- Save off the socket, and server address in a handle
  28. return (sock, serveraddr)
  29.  
  30. john :: Person
  31. john = Person {
  32. AddressBookProtos.Person.id = 1234,
  33. name = uFromString "John Doe",
  34. email = Just $ uFromString "jdoe@example.com",
  35. phone = fromList [
  36. PhoneNumber {
  37. number = uFromString "555-4321",
  38. type' = Just HOME
  39. }
  40. ]
  41. }
  42.  
  43. johnLBS :: LBS.ByteString
  44. johnLBS = messagePut john
  45.  
  46. lazyToStrictBS :: LBS.ByteString -> BS.ByteString
  47. lazyToStrictBS x = BS.concat $ LBS.toChunks x
  48.  
  49. main::IO()
  50. main = do (sock, addr) <- opensocket "localhost" "4567"
  51. _ <- sendTo sock (lazyToStrictBS johnLBS) (addrAddress addr)
  52. return ()
Add Comment
Please, Sign In to add comment