gpt4 book ai didi

sockets - 如何将最小开销代理写入本地主机 :3389 in Haskell?

转载 作者:行者123 更新时间:2023-12-03 11:57:15 25 4
gpt4 key购买 nike

更新:问题现在包含最终编辑的答案!

我现在使用以下(最终答案):

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 .@. rp

(.@.) :: Host -> Port -> IO Socket
host .@. 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

可以这样运行:

proxy 2000 localhost 3389

使用 mRemote,如果我连接到 localhost:2000,我看到本地机器的登录屏幕! :)

*如果我找到进一步改进 (>-) 的方法,我将更新此答案!

最佳答案

看来你是来this tcp proxy gist的找资料的时候。这时,是破烂的,有点乱。在这种情况下,请毫不犹豫地联系作者(在这种情况下是我),以便他可以修复要点以供将来引用:)

我会尽快修复它并链接到这个 SO 问题。固定版本将包括 sendAll 以及来自这个 SO 问题的所有好的建议,所以请分享你最好的想法。作为旁注,this branch of throttle如果有兴趣,已经有 sendAll 修复。

编辑:要点现在已修复

关于sockets - 如何将最小开销代理写入本地主机 :3389 in Haskell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com