А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Практическое знакомство с TCP мы начнем с написания простейшего сервера. На компакт-диске этот сервер находится в папке SimplestServer. Сразу отметим, что это чисто учебный пример, и брать его за основу при создании реальных серверов ни в коем случае нельзя. Чуть позже мы напишем другой сервер, который уже может служить образцом для подражания.

Наш простейший сервер будет использовать только одну нить. Как мы помним, сервер должен вызывать две функции, которые блокируют работу нити: accept и recv. Очевидно, что задействовать их обе сразу в одной нити не получится, именно поэтому наш сервер сможет работать только с одним клиентом одновременно. И чтобы не блокировать пользовательский интерфейс, наш сервер будет консольным приложением. В командной строке ему передается номер порта, к которому привязывается слушающий сокет.

Первое, что должен сделать сервер, — это создать сокет. привязать его к требуемому адресу и перевести в режим прослушивания. Этот код мало чем отличается от приведенного ранее примера создания сокета для UDP (см. листинг 2.8). Вся разница только в том, что вместо сокета типа SOCK_DGRAMсоздается сокет типа SOCK_STREAM, а в конце еще вызывается функция listen(листинг 2.14).

Листинг 2.14. Создание сокета в программе SimplestServer

var

// Порт, который будет "слушать" сервер

Port: Word;

// "Слушающей" сокет

MainSocket: TSocket;

// Сокет, создающийся для обслуживания клиента

ClientSocket: TSocket;

// Адрес "слушающего" сокета

MainSockAddr: TSockAddr;

// Адрес подключившегося клиента

ClientSockAddr: TSockAddr;

// Размер адреса подключившегося клиента

ClientSockAddrLen: Integer;

//Без этой переменной не удастся инициализировать библиотеку сокетов

WSAData: TWSAData;

StrLen: Integer;

Str: string;

begin

try

if ParamCount = 0 then

// Если в командной строке порт не задан, назначаем его

Port := 12345;

else

// В противном случае анализируем командную строку и назначаем порт

try

Port := StrToInt(ParamStr(1));

if Port = 0 then

raise ESocketException.Create(

'Номер порта должен находиться в диапазоне 1-65535');

except

on EConvertError do

raise ESocketException.Create(

'Параметр "' + ParamStr(1) + '" не является целым числом');

on ERangeError do

raise ESocketException.Create(

'Номер порта должен находиться в диапазоне 1-65535');

end;

// инициализация библиотеки сокетов

if WSAStartup($101, WSAData) <> 0 then

raise ESocketException.Create(

'Ошибка при инициализации библиотеки WinSock');

// Создание сокета, который затем будет "слушать" порт

MainSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if MainSocket = INVALID_SOCKET then

raise ESocketException.Create(

'Невозможно создать слушающий сокет: ' + GetErrorString');

// Формирование адреса для "слушающего" сокета

FillChar(MainSockAddr.sin_zero, SizeOf (MainSockAddr.sin_zero, 0);

MainSockAddr.sin_family := AF_INET;

// Выбор IP-адреса доверяем системе

MainSockAddr.sin_addr.S_addr := INADDR_ANY;

// Порт назначаем, не забывая перевести его номер в сетевой формат

MainSockAddr.sin_port := htons(Port);

// Привязка сокета к адресу

if bind(MainSocket, MainSockAddr, SizeOf(MainSockAddr)) = SOCKET_ERROR then

raise ESocketException.Create(

'Невозможно привязать слушающий сокет к адресу: ' +

GetErrorString);

// Установка сокета в режим прослушивания

if listen(MainSocket, SOMAXCONN) = SOCKET_ERROR then

raise ESocketException.Create(

'Невозможно установить сокет в режим прослушивания: ' +

GetErrorString);

WriteLn(OemString('Сервер успешно начал прослушивание порта '), Port);

...

// Основная часть сервера приведена в листинге 2.15

...

except

on Е: ESocketException do

WriteLn(OemString(E.Message));

on E: Exception do

WriteLn(OemString('Неожиданное исключение ' + E.ClassName +

' с сообщением ' + E.Message));

end;

end.

Основная часть кода сервера — это два цикла, один из которых вложен в другой (листинг 2.15). Перед внешним циклом сервер создает сокет и переводит его в режим прослушивания, и внешний цикл начинается с вызова функции accept. Завершение acceptуказывает на подключение клиента. После этого начинается внутренний цикл, который состоит из получения сообщений от клиента, преобразования строки и отправки ответа. Внутренний цикл завершается, когда соединение разрывается либо самим клиентом, либо из-за ошибки в сети. После этого управление вновь передается на начало внешнего цикла, т.е. на accept, и сервер может принять подключение другого клиента (или повторное подключение того же клиента).

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «О чём не пишут в книгах по Delphi»

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «О чём не пишут в книгах по Delphi»

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x