GithubHelp home page GithubHelp logo

Comments (4)

sayurin avatar sayurin commented on June 11, 2024

ffftpではIPv4 / IPv6を明示的に選択しておらず、Windowsに任せています。

ホスト名が正しいにもかかわらずアクセスできず、IPv4アドレスでアクセスできたのであれば、Windowsの設定としてIPv6が優先されるようになっていると思われます。加えて、IPv6を扱えないネットワーク環境をお持ちの方なのであれば、ffftp単体での解決を目指さず、Windowsの設定としてIPv4を優先したりIPv6を無効化したりをお勧めします。


具体的な実装としてはこの辺りでして、SOCKS v4を使用していない限りはAF_UNSPECを指定することでIPv4 / IPv6どちらで接続してもよいとしています。(他方のAF_INETはIPv4を意味し、ここに登場していないAF_INET6がIPv6です。)

ffftp/connect.cpp

Lines 1364 to 1379 in 731e225

if (auto ai = getaddrinfo(host, port, Fwall == FWALL_SOCKS4 ? AF_INET : AF_UNSPEC)) {
// ホスト名がIPアドレスだった
Notice(IDS_MSGJPN017, host, AddressPortToString(ai->ai_addr, ai->ai_addrlen));
memcpy(&std::get<sockaddr_storage>(target), ai->ai_addr, ai->ai_addrlen);
} else if ((Fwall == FWALL_SOCKS5_NOAUTH || Fwall == FWALL_SOCKS5_USER) && FwallResolve == YES) {
// SOCKS5で名前解決する
target = std::tuple{ std::move(host), port };
} else if (ai = getaddrinfo(host, port, Fwall == FWALL_SOCKS4 ? AF_INET : AF_UNSPEC, CancelCheckWork)) {
// 名前解決に成功
Notice(IDS_MSGJPN017, host, AddressPortToString(ai->ai_addr, ai->ai_addrlen));
memcpy(&std::get<sockaddr_storage>(target), ai->ai_addr, ai->ai_addrlen);
} else {
// 名前解決に失敗
Notice(IDS_MSGJPN019, host);
return {};
}

from ffftp.

kawasumi2019 avatar kawasumi2019 commented on June 11, 2024

ありがとうございます。ソースコードを拝見しました。こういう風になっているんですね。
仰る通りWindowsの設定の方を変更して解決するのは一番スマートではあると思うんですけど、一方で例えばGoogleでもAAAAレコードは設定されているようでして

nslookup type=AAAA google.co.jp

その方からすれば、ブラウザでアクセス出来るのにFFFTPでだけアクセス出来ないということになります。
調べてみますとaddrinfo構造体のai_nextを追うことで複数のアドレスを参照出来るようですけれど、こちらを利用して解決することは難しいでしょうか。

from ffftp.

sayurin avatar sayurin commented on June 11, 2024

古い機能がてんこ盛りなスパゲッティコードなため、別アドレスで再接続が簡単には書けないのが実情です。(引用範囲でも名前解決を3回、そのあとにももう2回の名前解決を行っている有様です。)

なお、getaddrinfoは名前解決を行うのみで、その後にそのアドレスに対して接続を行う必要があります。そして、そこで繋がるまでリトライすることが望まれるわけですが、それを実現する WSAConnectByName というAPIが既に用意されています。(このAPIはWindows Vista以降専用となっているため、ffftp v5.0でWindows XP対応を廃止するまで利用できずにいました。)

仮にそのような対応をして接続できるようになったとしても、OSの設定は間違ったままなのですから、一旦接続エラーが発生してからの再接続となり、「つながるまでに時間がかかる」と言われる未来が予想されます。基本的には小手先での対処でなく根本解決すべきと思います。

なお、Webブラウザーとは比較されたくありません。Webブラウザーであれば、自社で接続確認用サーバーを立ててプログラム起動時にIPv4 / IPv6 / DNSなどネットワーク環境を調査しています。ffftpにはそのような財力はなく、プログラム単体での処理に制限されます。


否定的なことを書きましたが、 WSAConnectByName への移行は別途検討しています。

from ffftp.

kawasumi2019 avatar kawasumi2019 commented on June 11, 2024

そんなに名前解決されてたとは知りませんでした。
そうしますと難しいですね。こんなのを見かけたので普通に出来るのかと思ってしまいました。

ブラウザと比較したのはソフトウェアの規模の比較ではなくて、HTTPとFTPの比較です。
念頭にあったのは再接続を繰り返すことでしたので、環境整備まで必要になる開発投資は頭にはなく、それでも感情を逆なでしてしまっていたとあれば、それは申し訳無いです。

from ffftp.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.