更新:質問には最終的に編集された回答が含まれています。私は今、次の(最終的な答えを)使用Haskellのlocalhost:3389に最小オーバーヘッドプロキシを書き込む方法は?
:
module Main where
import Control.Concurrent (forkIO)
import Control.Monad (when,forever,void)
import Network (PortID(PortNumber),listenOn)
import Network.Socket hiding (listen,recv,send)
import Network.Socket.ByteString (recv,sendAll)
import qualified Data.ByteString as B
import System
type Host = String
type Port = PortNumber
main :: IO()
main = do
[lp,h,p] <- getArgs
start (port lp) h (port p)
where
port = fromInteger . read
start :: Port -> Host -> Port -> IO()
start lp rh rp = withSocketsDo $ do
proxy <- listenOn $ PortNumber lp
forever $ do
(client,_) <- accept proxy
void . forkIO $ (client >-<) =<< rh [email protected] rp
([email protected]) :: Host -> Port -> IO Socket
host [email protected] port = do
addr:_ <- getAddrInfo Nothing (Just host) (Just $ show port)
server <- socket (addrFamily addr) Stream defaultProtocol
connect server (addrAddress addr)
return server
(>-<) :: Socket -> Socket -> IO()
x >-< y = do x >- y; y >- x
(>-) :: Socket -> Socket -> IO()
s >- r = void . forkIO . handle $ forever stream
where
stream = recv s (64 * 1024) >>= ifNot0 >>= sendAll r
ifNot0 = \c -> do when (B.null c) $ handle (error "0"); return c
handle = flip catch $ \e -> print e >> sClose s >> sClose r
このように実行することができます:2000年、私は:私はローカルホストに接続する場合、mRemoteを使用して
proxy 2000 localhost 3389
ローカルマシンのログイン画面が表示されます。 :)
* (>-)
を改善する方法が見つかった場合は、この回答を更新します。
彼のコードで解決しようとしている問題は何ですか? –
@MikePennington、私はちょうど私が質問の最後に解決しようとしている問題を説明しました。 –
@Cetin Sert:あなたの質問はこれをもっと速くする方法です。 –