質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.11%

【GO】golangでFTPSアプリを構築したいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 402

Gunjirk

score 17

以下ソースコードを実行したら、proc.goに飛んで終了してしまいます。
原因がわかる方いましたら、ご教授願います。

package main

import (
    "fmt"

    "github.com/onbings/ftpsclient"
)

func main() {

    var FtpsClientParam_X ftpsclient.FtpsClientParam

    FtpsClientParam_X.Id_U32 = 123
    FtpsClientParam_X.LoginName_S = "mc"
    FtpsClientParam_X.LoginPassword_S = "a"
    FtpsClientParam_X.InitialDirectory_S = "/Seq"
    FtpsClientParam_X.SecureFtp_B = false
    FtpsClientParam_X.TargetHost_S = "127.0.0.1"
    FtpsClientParam_X.TargetPort_U16 = 21
    FtpsClientParam_X.Debug_B = false
    FtpsClientParam_X.TlsConfig_X.InsecureSkipVerify = true
    FtpsClientParam_X.ConnectTimeout_S64 = 2000
    FtpsClientParam_X.CtrlTimeout_S64 = 1000
    FtpsClientParam_X.DataTimeout_S64 = 5000
    FtpsClientParam_X.CtrlReadBufferSize_U32 = 0
    FtpsClientParam_X.CtrlWriteBufferSize_U32 = 0
    FtpsClientParam_X.DataReadBufferSize_U32 = 0x100000
    FtpsClientParam_X.DataWriteBufferSize_U32 = 0x100000

    FtpsClientPtr_X := ftpsclient.NewFtpsClient(&FtpsClientParam_X)
    if FtpsClientPtr_X != nil {
        Err := FtpsClientPtr_X.Connect()
        if Err == nil {
            DirEntryArray_X, Err := FtpsClientPtr_X.List()
            if Err == nil {
                for _, DirEntry_X := range DirEntryArray_X {
                    fmt.Printf("(%d): %s.%s %d bytes %s\n", DirEntry_X.Type_E, DirEntry_X.Name_S, DirEntry_X.Ext_S, DirEntry_X.Size_U64, DirEntry_X.Time_X)
                }
                ReplyCode_i, ReplyMessage_S, Err := FtpsClientPtr_X.SendFtpCtrlCommand("FEAT", 211)
                fmt.Printf("feat %d %s\n", ReplyCode_i, ReplyMessage_S)
                if Err != nil {
                    Err = FtpsClientPtr_X.Disconnect()
                }

            }
        }
    }
}
//proc.go

    if atomic.Load(&runningPanicDefers) != 0 {
        // Running deferred functions should not take long.
        for c := 0; c < 1000; c++ {
            if atomic.Load(&runningPanicDefers) == 0 {
                break
            }
            Gosched()
        }
    }
    if atomic.Load(&panicking) != 0 {
        gopark(nil, nil, waitReasonPanicWait, traceEvGoStop, 1)
    }

    exit(0)

以下のサイトを参考にしました。

https://github.com/onbings/ftpsclient

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • d_tutuz

    2020/07/04 00:05

    ローカルの環境で FTP サーバーは起動していますか?

    キャンセル

  • Gunjirk

    2020/07/06 09:15

    d_tutuzさん、ご回答ありがとうございます!

    targethostの設定しているサーバーが起動しています。
    業務データにつきIPアドレスを出せないため、元データのlocalhostのままにしています。


    開発環境では、サーバのIPアドレスを設定しています。

    ちなみにですが、、

    FtpsClientPtr_X := ftpsclient.NewFtpsClient(&FtpsClientParam_X)
    if FtpsClientPtr_X != nil {
    Err := FtpsClientPtr_X.Connect()
    if Err == nil ←ここでproc.goの該当箇所に飛んでいます。

    キャンセル

  • nobonobo

    2020/07/07 08:44

    proc.goうんぬんは単に終了処理ですのであまり関係ないです。
    Errがnilではないからmain処理で実行する処理内容が無く、
    記述通りプログラムが終了しているだけです。
    Goプログラムの一般的な実装ではErrがnilでない場合はそのErrを表示しましょう。
    そうすると何が問題なのかが見えてくるはずです。

    キャンセル

  • Gunjirk

    2020/07/07 09:04

    nobonoboさん、ご回答ありがとうございます!
    Errを出力した結果、以下が返ってきました。

    Ftps: Connection is not established
    参考までにデバック内容は以下です。
    09:01:04.744042 [FTP CON] Connect to IPアドレス:ポート->dial tcp4 IPアドレス:ポート: i/o timeout

    ローカルでFFFTPを使用したら、対象のFTPサーバーに接続できるため、原因がわからない状態です。。。

    よろしくお願いします。

    キャンセル

回答 1

checkベストアンサー

+1

github.com/onbings/ftpsclientは試してみたところ、接続できない問題があるようです。
(こういう時、GitHubの最終更新日付を確認するのはおすすめです。このリポジトリは6年前の更新からメンテされていません。)

github.com/jlaffaye/ftpを使った例を以下に上げておきます。
こちらでつながるかどうかお試しください。

package main

import (
    "log"
    "time"

    "github.com/jlaffaye/ftp"
)

func main() {
    c, err := ftp.Dial("localhost:2121", ftp.DialWithTimeout(5*time.Second))
    if err != nil {
        log.Fatal(err)
    }

    err = c.Login("user", "password")
    if err != nil {
        log.Fatal(err)
    }
    entries, err := c.List("")
    if err != nil {
        log.Fatal(err)
    }
    for _, e := range entries {
        log.Println(e)
    }

    if err := c.Quit(); err != nil {
        log.Fatal(err)
    }
}

FTPSで繋ぐ場合は DialWithExplicitTLS を利用するようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/07 10:22

    nobonoboさん!ご回答ありがとうございます!

    >github.com/onbings/ftpsclientは試してみたところ、接続できない問題があるようです。
    >(こういう時、GitHubの最終更新日付を確認するのはおすすめです。このリポジトリは6年前の更新からメンテされていません。)

    そもそも使えないリポジトリだったのですね。
    知れてよかったです。今後は注意していきます。

    教えていただいたコードを試してみたところ、つながってはいるものの、暗号化の問題でエラーが出ているそうです。
    2020/07/07 10:17:41 Non-anonymous sessions must use encryption.

    nobonoboさんの仰るとおり、DialWithExplicitTLS を利用すれば解決しそうです。

    勉強不足で申し訳ないのですが、DialWithExplicitTLS の利用方法がわからないので、教えていただきたいです。。

    キャンセル

  • 2020/07/08 10:09

    ftp.Dialのオプションにftp.DialWithExplicitTLSを指定したらできました!
    ありがとうございました!!

    キャンセル

  • 2020/07/08 10:34

    よかった!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる