Guest User

Untitled

a guest
Jul 17th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. module Main where
  2.  
  3. import Control.Concurrent (forkIO)
  4. import Control.Monad (forever, unless)
  5. import Network (PortID(PortNumber),listenOn)
  6. import Network.Socket hiding (listen,recv,send)
  7. import Network.Socket.ByteString (recv,sendAll)
  8. import qualified Data.ByteString as S
  9. import System.Posix (Handler(Ignore),installHandler,sigPIPE)
  10.  
  11. data Setting = Setting { locPort :: PortNumber , remHost :: String, remPort :: String }
  12.  
  13. setting :: Setting
  14. setting = Setting 9900 "ftp.free.fr" "80"
  15.  
  16. main :: IO ()
  17. main = installHandler sigPIPE Ignore Nothing >> do
  18. withSocketsDo $ do
  19. listener <- listenOn $ PortNumber (locPort setting)
  20. forever $ accept listener >>= \(client,_) ->
  21. ignore $ forkIO $ do
  22. server <- getServerSocket
  23. client <~~> server
  24. where
  25. getServerSocket = do
  26. (servAddr:_) <- getAddrInfo Nothing (Just $ remHost setting) (Just $ remPort setting)
  27. server <- socket (addrFamily servAddr) Stream defaultProtocol
  28. connect server (addrAddress servAddr) >> return server
  29. p1 <~~> p2 = ignore $ forkIO (p1 `proxyTo` p2) >> forkIO (p2 `proxyTo` p1)
  30. proxyTo from to = flip catch (const $ sClose from >> sClose to) $ mapData from to
  31. mapData from to = do
  32. content <- recv from 4096
  33. unless (S.null content) $ sendAll to content >> mapData from to
  34. ignore x = x >> return ()
Add Comment
Please, Sign In to add comment