Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FTP Client на C#

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

AndrewWork

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
v0yager, за замечание о p1, p2 - огромный thank's.  
А насчёт других клиентов - так я их часто использую для сравнения ... у меня всё один в один идёт с ними, и обращение моё м сервером я записывал, в часности Ириской.
 
rew - по моему так TCPView от Sysinternals лучше, сам обновляется, висит не мешает

Всего записей: 77 | Зарегистр. 17-03-2003 | Отправлено: 21:20 12-05-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
по моему так TCPView от Sysinternals лучше

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

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 22:53 12-05-2003
AndrewWork

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чёрт, походу я совсем запутался ... никак не связаться с сервером по PORT. Кто-нибудь имевший опыт в этом деле, отзовитесь.
Я нашёл в каких - то исходниках такой пример:
private Socket CreateDataSocketActive()
{
// create listening socket at a system allocated port
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// choose any port
IPHostEntry localHostEntry = Dns.Resolve(Dns.GetHostName());
IPEndPoint localEndPoint = new IPEndPoint(localHostEntry.AddressList[0], 0);
sock.Bind(localEndPoint);
// queue up to 5 connections
sock.Listen(5);
// get the listen port
int port = ((IPEndPoint)sock.LocalEndPoint).Port;
IPAddress addr = ((IPEndPoint)sock.LocalEndPoint).Address;
// find out ip & port we are listening on
SetDataPort((IPEndPoint)sock.LocalEndPoint);
return sock;
}
private void SetDataPort(IPEndPoint ep)
{
byte[] hostBytes = ep.Address.GetAddressBytes();
byte[] portBytes = ToByteArray((ushort)ep.Port);
// assemble the PORT command
string cmd = new StringBuilder("PORT ").
Append((short)hostBytes[0]).Append(",").
Append((short)hostBytes[1]).Append(",").
Append((short)hostBytes[2]).Append(",").
Append((short)hostBytes[3]).Append(",").
Append((short)portBytes[0]).Append(",").
Append((short)portBytes[1]).ToString();
// send command and check reply
string reply = SendCommand(cmd);
ValidateReply(reply, "200");
}
Так даж повторить не удаётся. Сокет не устонавливает соединение нивкакую ... уже начинаю думать что тут ошибка в ДНК

Всего записей: 77 | Зарегистр. 17-03-2003 | Отправлено: 01:14 14-05-2003
rew



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
может сервер не поддерживает этот режим? те может я гоню, но на сколько я помню есть фтп сервера, которые не поддерживают один из 2 режимов, какой правда не помню...

Всего записей: 442 | Зарегистр. 09-09-2001 | Отправлено: 01:20 14-05-2003
v0yager



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2AndrewWork
 
запиши в пост ссылку, с которой ты снял пример фтп-клиента на с# (исходная версия) Если есть возможность выложить архив с измененной тобой версией (текущей) - тоже.
 
Отлаживать программу через форум публикуя то одну функцию, то другую можно еще долго.
 
Дополнительно, напиши адрес фтп-сервера, на котором ты тестируешь клиент (если это не внутренний сервер, конечно).
 
Кстати, между тобой и сервером есть прокси, файрволлы?
 
 
 

Всего записей: 95 | Зарегистр. 08-05-2003 | Отправлено: 09:46 14-05-2003
AndrewWork

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пример работы с PORT mode взят мною отсюда - http://www.enterprisedt.com/downloads/csftp/ftp-0.9.zip
FTP сервер на котором тестирую клиент - внутренний. FTP серверов тут много, и многие поддерживают PASV mode, но некоторые админы для безопасности открывают только PORT mode (это связано и с использованием файрволов в том числе). С моей стороны на время работы все фаирволы и прокси я отключаю, так что в этом проблемы быть не может. Выложить мои исходники вряд ли возможно, так как трафик платный, но могу скинуть на мыло.

Всего записей: 77 | Зарегистр. 17-03-2003 | Отправлено: 10:51 14-05-2003
v0yager



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2AndrewWork
 
мой почтовый адрес у тебя в ПМ

Всего записей: 95 | Зарегистр. 08-05-2003 | Отправлено: 11:37 14-05-2003
AndrewWork

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
отправил

Всего записей: 77 | Зарегистр. 17-03-2003 | Отправлено: 20:25 14-05-2003
v0yager



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2AndrewWork
 
сообщение по почте с сорсами получил.
 
Сначала о примере фтп-клиента с адреса:http://www.enterprisedt.com/downloads/csftp/ftp-0.9.zip
 
это библиотека для работы с фтп с исходным кодом, лицензией GNU. Она собирается и работает, добротно сделана.  Мне пришлось подправить ее для .NET v1.0 (написать свой GetAddressBytes), в остальном - все о.к. Я проверил ее на внутреннем фтп-сервере и в PORT mode, и в PASV mode - работает (логин, списки файлов, прием-передача).
 
После разборок с библиотекой я внимательно ознакомился с присланными сорсами. Основной вывод после проведения анализа: полный переход на эту библиотеку для работы с фтп является целесообразным и съекономит тебе много времени.
 
Существующий код отлаживать и доводить до рабочего состояния не имеет смысла. Там много фрагментов (взятых из разных источников), работающих в отдельности, но слабо согласованных между собой. Для того, что бы они заработали вместе, тебе придется сделать аналогичную библиотеку и все равно переделать свою программу полностью. Заставить стабильно работать то, что есть, тебе, с большой степенью вероятности, не удасться (или займет много времени). Так что лучше сразу взять фтп-библиотеку и сосредоточиться на интерфейсе и прикладных алгоритмах.  
 
Заметка на будущее: код GUI лучше не смешивать с реализациями алгоритмов, к UI никакого отношения не имеющего. Например, фтп-клиент. Иначе отлаживать такое хозяйство будет трудно, да и с повторным использованием разработок будут проблемы. Пример из присланных сорсов: с повторным использованием FTPBuild, наследованного от System.Windows.Forms.Form в большинстве случаев будут трудности - например, в ASP.NET приложении.

Всего записей: 95 | Зарегистр. 08-05-2003 | Отправлено: 15:40 15-05-2003
AndrewWork

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, v0yager за помощь. Твоя помощь неоценима. Пожалуй я поступлю как ты советуешь. Если это не затруднит - выложи либо сюда либо мне на мыло вид исправленной функции GetAddressBytes.

Всего записей: 77 | Зарегистр. 17-03-2003 | Отправлено: 16:57 15-05-2003
v0yager



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
#region GetAddressBytes
 
/// <summary>
/// Provides a copy of the IPAddress as an array of bytes.
/// </summary>
/// <param name="ipAddress">The IPAddress.</param>
/// <returns>Array of bytes.</returns>
public static byte[] GetAddressBytes(IPAddress ipAddress)
{
return GetAddressBytes(ipAddress.ToString());
}
 
/// <summary>
/// Provides a copy of the IPAddress as an array of bytes.
/// </summary>
/// <param name="ipAddress">A dotted IP address string.</param>
/// <returns>Array of bytes.</returns>
public static byte[] GetAddressBytes(string ipAddress)
{
byte[] bytes = new byte[4];
 
try
{
string[] sBytes = ipAddress.Split('.');
 
for (int i = 0; i < 4; i++)
bytes[i] = byte.Parse(sBytes[i]);
}
catch  
{
throw new Exception(string.Format("Could not parse IP address string '{0}'.", ipAddress));
}
 
return bytes;
}
 
private static byte[] GetAddressBytes(long longAddress)
{
byte[] bytes = new Byte[4];
double temp = longAddress / 16777216d;
double tempMod = longAddress % 16777216d;
 
bytes[0] = (byte)Math.Floor(temp);
 
temp = tempMod / 65536d;
tempMod = tempMod % 65536d;
 
bytes[1] = (byte)Math.Floor(temp);
 
temp = tempMod / 256d;
tempMod = tempMod % 256d;
 
bytes[2] = (byte)Math.Floor(temp);
 
bytes[3] = (byte)(tempMod);
 
return bytes;
}
#endregion
 

 
я заменял фрагмент
 

Код:
 
byte[] hostBytes = ep.Address.GetAddressBytes();
 

 
на
 

Код:
 
byte[] hostBytes = GetAddressBytes(ep.Address);
 


Всего записей: 95 | Зарегистр. 08-05-2003 | Отправлено: 17:22 15-05-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FTP Client на C#


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru