packages feed

netw-0.1.0.0: test/server-client/Main.hs

{-# LANGUAGE OverloadedLists #-}
module Main (main) where

import Netw.Socket
import Netw.SockAddr

import Control.Monad

import Data.Function
import Data.Bits
import Data.Primitive

import System.Exit
import System.Posix

serverMain :: FilePath -> IO ()
serverMain sunPath = do
  server <- socket PF_UNIX SOCK_STREAM DefaultProtocol
  bind server addr
  listen server 1
  
  client <- accept_ server
  fix (\ again -> do
    msg <- recvsome client 128 zeroBits
    if sizeofByteArray msg > 0
    then do
      putStrLn ("SERVER RECEIVED " ++ show (sizeofByteArray msg) ++ " BYTES")
      void (sendall client msg zeroBits)
      again
    else do
      putStrLn "SERVER EXIT"
      return ()
    )
  closeSocket client
  
  removeLink sunPath
  closeSocket server
  where addr = SockAddrUn sunPath
        

clientMain :: FilePath -> IO ()
clientMain sunPath = do
  server <- socket PF_UNIX SOCK_STREAM DefaultProtocol
  connect server addr
  void (sendall server [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] zeroBits)
  msg <- recvsome server 128 zeroBits 
  putStrLn ("CLIENT RECEIVED " ++ show (sizeofByteArray msg) ++ " BYTES")
  closeSocket server
  where addr = SockAddrUn sunPath

main :: IO ()
main = do
  s <- forkProcess (serverMain sunPath)
  c <- forkProcess (clientMain sunPath)
  
  serverExit <- maybe (fail "Server failure") return =<< getProcessStatus True True s
  clientExit <- maybe (fail "Client failure") return =<< getProcessStatus True True c

  case (serverExit, clientExit) of
    (Exited ExitSuccess, Exited ExitSuccess) -> exitSuccess
    _otherwise -> exitFailure
  where sunPath = "/run/user/1000/test"