C # - реализация протокола Ftp - PullRequest
3 голосов
/ 16 февраля 2011

в Compact Framework протокол Ftp не реализован, поэтому я разработал его сам.

У меня есть вопрос о пассивном режиме и командах, которым необходим канал данных для чтения ответа.

В моем случае я пытаюсь получить (RETR) файл на моем FTP-сервере, поэтому я делаю:

Часть, которая хорошо работает:

  • OpenControlChannel
  • ReadControl (Баннерное сообщение)
  • SendUser
  • ReadControl (Ожидание пропуска?)
  • SENDPASS
  • ReadControl (приветственное сообщение)
  • SendPassive
  • ReadControl (Извлечение IP для канала данных)

Части, которые не очень хорошо работают (но работают тоже, см. Пояснение ниже)

  • RETR myFile
  • OpenDataChannel
  • ReadControl (Здесь я получаю сообщение «Begin Transfert» И "Transfert complete", перед прочтением любые данные!)
  • ReadData
  • CloseDataChannel
  • CloseControlChannel

Проблема в том, что мне нужно просто открыть канал данных, чтобы получить сообщение «Transfert complete», даже если я не прочитал никаких данных в потоке, это нормально?

Для меня, когда я открываю канал данных, я должен просто получить

"150 Открытие данных в режиме ASCII соединение для a.she (0 байт). \ r \ n "

Затем, когда операция чтения завершена:

"226 Передача завершена. \ R \ n"

Когда я смотрю на классический протокол Ftp, используемый в .NET Framework, это имеет место:

FtpWebResponse ftpres = (FtpWebResponse)ftp.GetResponse();
// ftpres.StatusDescription = "150 Opening ASCII mode data connection for a.she (0 bytes).\r\n" 
string res = new StreamReader(ftpres.GetResponseStream()).ReadToEnd();
// ftpres.StatusDescription = "226 Transfer complete.\r\n"

Надеюсь, я достаточно ясно ... Спасибо!

1 Ответ

0 голосов
/ 18 февраля 2011

Я думаю, что это нормальное поведение, он предварительно загружает данные в кэш на стороне сервера и отправляет сообщение, чтобы сказать, что данные доступны и загружены.

Это потому, что когда канал данных находится между 2 серверами(а не в режиме клиент / сервер), пользователь должен теперь, когда передача завершена, поэтому он должен только взглянуть на этот кеш ...

(РЕДАКТИРОВАТЬ: В некоторых случаях кажется, что я получил сообщения вхороший порядок (только однажды прочитанные данные), странно ...)

...