2017-10-05 30 views
0

rawコマンドを使用してFTPサーバーにファイルをアップロードしようとしています。はい、私はこれを行うためのプログラムやパッケージがあることを知っていますが、私のような贅沢な組み込みアプリケーションです。私の問題は、すべての適切なコマンドを正常に発行した後、ファイルがサーバー上に存在しないことです。ここで raw FTP STORコマンドの使用方法

は私がやったことだ:

  1. 私はポート21(Sock1)に私のFTPサーバへのコマンドのソケット接続を確立し、挨拶を受け、私は "USER myusernameと指定" 送信
  2. (コード220)と私は "PASS mypasswordという" を送信成功コード331
  3. を受信して​​、成功コード230
  4. を受け、私は "TYPE I" を送信し、成功コード200
  5. を受け取ります
  6. "PASV"を送信し、成功コード227を6つの数字とともに受信します。
  7. これらの番号をIPアドレスとポートにデコードします。彼らは妥当に見えます。
  8. 上記のアドレスとポート(Sock2)へのTCPデータソケット接続を正常に開きます。
  9. 私はsuccessfuly Sock2にmyfilenameの内容を送信する "STOR myfilename" を送信し、成功コード150
  10. を受けます。
  11. 私はSock2を閉じ、次にSock1を閉じます。

すべてが消えているようですが、サーバー上のファイルはありません。誰か私が間違っていたことを教えてもらえますか?

私はさまざまなFTPクライアントプログラム(PUTコマンドを使用)を使用してファイルをアップロードできるので、サーバーのOkを知っています。

+1

これは、サーバが正常な転送を確認するのを待つ必要があることを除いて、ほとんどOKです。つまり、ステップ10でsock2を閉じ、サーバから226を待ち、次にsock1を閉じます。また、sock1を閉じる前に応答を待つなど、quitコマンドを追加することもできます。それとは別に、実際の実装がここで説明しているものとは異なる場合があります。 –

+0

あなたは右のステファンだった。最初にsock2を閉じて、それを確定するのを待っていた。これを「回答」として提出すれば、私はそれを受け入れます。 – DontPanic

答えて

2
  1. 私は成功裏にmyfilenameの内容をSock2に送信します。
  2. 私はSock2を閉じ、次にSock1を閉じます。転送はデータ接続(sock2)が行われ

サーバへのデータの終わりを知らせるために閉鎖される必要があります。サーバは、クライアントへの応答を返す。この応答は、制御チャネル(sock1)を閉じる前に読み取る必要があります。ここでのように、sock1とsock2がほぼ同時に閉じられると、サーバはデータチャネル(sock2)が閉じる前に制御チャネル(sock1)の終了を記録し、データ転送を中断して処理することがあります。

関連する問題