2

私はこの問題に何週間も取り組んできましたが、それを理解できないようです...私はsocks5プロキシ(つまりtor)に接続するHaskellプログラムを作成しようとしてきたので、オニオンサイトにアクセスできますプログラム内からですが、機能していません。

レイアウトを提供するために、私は localhost@9050 で tor を実行していますが、socks5 を介して動作するようにブラウザーを構成できるため、確かに動作します。Privoxy が実行されていません。

ソースコードは次のとおりです。

import Network
import Network.Socket
import Network.Socks5

    getonion :: IO ()
    getonion = do
            putStrLn "Connecting..."
            sock <- socksConnectWith (defaultSocksConf "localhost" (PortNum 9050)) "exampleonion.onion" (PortNumber 80)
            putStrLn "Connected!"

getonion を実行するたびに、常に次の結果になります。

Connecting...
*** Exception: connect: does not exist (Connection refused)

あらゆる種類の方法、つまりここここで参照されている他の関数を使用して localhost に接続しようとしましたが、socksConnectWith が最も簡単に思えました。

誰かが私がこれを理解するのを手伝ってくれるなら、それは大歓迎です。プログラムから送信された Wireshark パケットを localhost にポストすることもできます。ありがとうございました。

4

1 に答える 1

7

コンストラクターを使用する代わりにPortNum、ソース ファイルにポート番号を記述します。

sock <- socksConnectWith (defaultSocksConf "localhost" 9050) "exampleonion.onion" (PortNumber 80)

PortNumber 80コンストラクターは実際には typeではなくPortNumbertype の引数を取るため、実際にこれを既にどのように行っているかに注意してください(残念ながら、タイプとコンストラクターは、他の点では無関係であっても同じ名前を持つことができます)。PortNumberWord16PortID

Haskell では、上記のような整数リテラルは (say) の省略形でfromInteger 80あり、(インスタンスである型クラスfromIntegerからの) 関数は、指定された整数をネットワーク バイト オーダーに変換しますが、コンストラクタを直接適用すると変換されません。NumPortNumber

この間違いを犯す可能性さえあるという事実は、(私が知る限り) ネットワーク パッケージの貧弱な API 設計の産物にすぎません。最近は改善されていますが、多くのクライアントの一部を混乱させずに、ネットワーク パッケージに API の変更を加えることは非常に困難です。

于 2013-01-05T16:16:59.053 に答える