Мне нужно вести запись в файл на FTP-сервере. Открыть, записать и сразу разорвать соединение. Подскажите, пожалуйста, как это можно сделать? Желательно, в одном методе (без активного объекта).
Мне нужно вести запись в файл на FTP-сервере. Открыть, записать и сразу разорвать соединение. Подскажите, пожалуйста, как это можно сделать? Желательно, в одном методе (без активного объекта).
В Symbian SDK нет готового клиента FTP. Пишите свой через сокеты. Либо используйте стороннюю библиотеку. Вот здесь есть пример использования на Симбиан библиотеки ftplib:
http://www.forum.nokia.com/info/sw.n..._1_en.zip.html
Но она портирована при помощи библиотек Open C.
Еще можно поискать в исходниках Symbian какое нибудь API для работы с FTP:
http://developer.symbian.org/xref/os...ct=%2FSymbian3
Но не факт что оно есть, не факт что его удасться использовать и не ясно, на каких моделях оно будет работать и нет ли нарушений совместимости.
Last edited by Trufanov; 2010-05-12 at 15:28.
Я скачал пример Series_60_Platform_FTP_Example_v1_0.zip и никак не могу понять: класс CFTPSession содержит чистые виртуальные функции. Никакого импорта из ftpsess.lib я не вижу. Как же он работает в этом примере? Может кто-нибудь объяснит?
IMPORT_C static CFTPSession* NewL(MFtpSessionNotifier* aNotifier);
Никак не могу понять, что я не так делаю. Подключил ftpsess.lib к проекту. Описал функции обратного вызова:
Код:Code:class CBTContainerView : public CAknView, public MListenerObserver, public MFtpSessionNotifier { ... void Cancel(void); void ConnReset(void); void ConnectionError(TOpComp aTConnectionError); ... }
serverAddress получаю нормально. Connect(), GetVersion() и Cancel() тоже проходят (на Cancel(), например, я попадаю в notifier Cancel()). Но вызов, например, GetCurrentDirectory() и многих других методов, приводит к ошибке: "No source available for "0x38C9636( ekern.exe )()".Code:TBuf<255> host(_L("***")); TBuf8<30> userName(_L8("***")); TBuf8<30> password(_L8("***")); RSocketServ sock_serv; User::LeaveIfError(sock_serv.Connect()); CleanupClosePushL(sock_serv); RHostResolver resolver; User::LeaveIfError(resolver.Open(sock_serv,KAfInet,KProtocolInetTcp)); CleanupClosePushL(resolver); TNameEntry name; User::LeaveIfError(resolver.GetByName(host,name)); CleanupStack::PopAndDestroy(&resolver); CleanupStack::PopAndDestroy(&sock_serv); TInetAddr serverAddress(name().iAddr); CFTPSession *iFtpSession; iFtpSession = CFTPSession::NewL(this); iFtpSession->Connect(serverAddress,userName,password, CFTPSession::EActive); TUint32 ver; ver=iFtpSession->GetVersion(); // iFtpSession->GetCurrentDirectory(); iFtpSession->Cancel();
C CFTPSession я не работал, но вы точно уверены, что вызовы вроде GetCurrentDirectory() и т.п. синхронные, а не асинхронные (что скорее всего)? Кроме того, вы уверены, что подключение Connect() проходит без ошибок? В таких случаях лучше проверять возвращаемое значение.
Метод Create() ничего не возвращает. Если произошла ошибка, она передаётся через handler.
Асинхронный метод GetCurrentDirectory() или нет, его вызов не должен ведь приводить к глобальной ошибке. А судя по ошибке, насколько я понимаю, указатель на метод неверный. Может быть это как-то связано с тем, что ftpsess.lib содержит только описание класса CFTPSession, а его реализация находится в ftpsess.dll (тестирую в эмуляторе).
В документации SDK начиная с S60 3rd ed. MR отсутствует упоминание о CFTPSession, видимо от его поддержки просто отказались (хотя заголовочные файлы и библиотеки есть), так что работоспособность вообще не гарантируется. А пример тот (Series_60_Platform_FTP_Example_v1_0.zip) предназначен для S60 2nd ed. FP1, FP2 и FP3.
ftpsess.lib - это библиотека импорта для ftpsess.dll. В ней не должно быть реализации.
Я понимаю, что импорта. Я просто надеюсь, может я что-то не так делаю. Может быть по этим скриншотам можно что-то понять: Рисунок 1, Рисунок 2 .
Пример с Open C громоздкий, и требует установки C Runtime. CFTPSession - то, что надо. Все-таки, хочу попробовать с ним разобраться.
С CFtpProtocol - то же самое. Мне кажется, я неправильно создаю экземпляр класса. Подскажите, пожалуйста, какой-нибудь класс, который точно должен работать и который имеет структуру наподобие этих двух классов - с чистыми виртуальными методами и notifier-ом. Я хочу попробовать.
Last edited by Djerom; 2010-05-14 at 13:52.
Как видно на втором скриншоте вызов метода Connect() завершается ошибкой
'err 10049' это 'Address is not available from the local machine'. И, соответственно, пытаться дальше что-то писать/читать бесполезно - ничего кроме ошибок не получите.WSOCK: ... connect failed, err 10049
Такого мне не попадалось.