LiteCoding

Заметки о программировании

Библиотека для работы с сокетами в Symbian

without comments

Ни для кого не секрет, что работа с ActiveObject (AO) в Symbian требует опыта и хорошего понимания, что творится на один-два уровня ниже. К сожалению, ни одно сетевое приложение невозможно написать без AO. Если время, чутье разработчика или природная лень предлагают опереться в этом вопросе на опыт других разработчиков, то лучше всего использовать абстракцию, написанную Дэреллом Карботтом (Darrell Karbott) для проекта iks-symbian (лицензия: LGPL).

Она уже заняла подобающее место в моем «боевом наборе разработчика». Также я взял на себя смелость выделить часть кода в отдельный проект symbiansocks (лицензия: LGPL) по следующим причинам:

  • CVS на SourceForge крайне нестабильно работает
  • проект iks-symbian завершен и более не поддерживается


А теперь пара слов о том, как им пользоваться. Сначала нужно создать экземпляр класса CSocket и назначить ему обработчик событий, унаследованный от интерфейса MSocketObserver, методом SetObserver.

Обработчик событий имеет единственный callback-метод (SocketNotify), который передает в параметрах указатель на вызывающий экземпляр класса CSocket и код события. С первым параметром нужно быть немного внимательным, т.к. при вызове из деструктора сокета в нем передается NULL.

События определяются следующие: EResolving, EConnecting, EConnected, ERead, EWrite, EError, EClosed. Их назначение вполне ясно из названия. Можно уточнить только то, что EWrite приходит, когда отправка данных произведена успешно, а ERead — когда есть входящие данные.

Класс CSocket имеет метод ConnectL, который позволяет разрешить доменное имя и установить соединение.

TBool ConnectL(const TDesC& host, TInt port, TBool readAutoRestart = ETrue);

Если readAutoRestart выставлен в ETrue, то ожидание новой входящей информации начинается сразу же после предыдущего цикла чтения. Но в любом случае первое чтение придется инициализировать вручную. Делается это так:

pSocket->EnableRead(ETrue);

Но выполнять это действие можно только тогда, когда сокет находится в состоянии EConnected (т.е. когда в обработчик пришло уведомление об этом событии). В случае, когда readAutoRestart установлен в EFalse, метод инициализации чтения придется вызывать вручную.

Отправка и прием данных также не вызовут трудностей:

TDesC8& RecvdData();
void Write(const TDesC8& data);

Ко всем методам класса CSocket есть комментарии на английском языке в файле CSocket.h. Поэтому смело обращайтесь к ним в случае, если возникнут какие-либо вопросы.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Written by Дмитрий Воробьев

Пятница, Март 26th, 2010 at 12:30

Leave a Reply

You must be logged in to post a comment.