Чтение онлайн

на главную - закладки

Жанры

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

Григорьев Антон Борисович

Шрифт:

ServerAddr.sin_port := htons(StrToInt(EditPort.Text));

// Создание сокета

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

if FSocket = INVALID_SOCKET then

begin

MessageDlg('Ошибка при создании сокета: '#13#10 +

GetErrorString, mtError, [mbOK], 0);

Exit;

end;

//
Подключение к серверу

if connect(FSocket, ServerAddr, SizeOf(ServerAddr)) < 0 then

begin

MessageDlg('Ошибка при установлении подключения: '#13#10 +

GetErrorString, mtError, [mbOK], 0);

// Так как сокет был успешно создан,

// в случае ошибки его нужно удалить

closesocket(FSocket);

FSocket := 0;

Exit;

end;

// Включаем режим "Соединение установлено"

OnConnect;

 except

on EConvertError do

// Это исключение может возникнуть только в одном месте -

// при вызове StrToInt(EditPort.Text)

MessageDlg('"' + EditPort.Text + '"не является целым числом',

mtError, [mbOK], 0);

on ERangeError do

// Это исключение может возникнуть только в одном месте -

// при присваивании значения номеру порта

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

mtError, [mbOK], 0);

 end;

end;

Теперь посмотрим, как клиент реагирует на нажатие кнопки Отправить (листинг 2.17). Сама по себе отправка — вещь очень простая: нужно сформировать адрес получателя и вызвать функцию

send
. Несколько сложнее выполняется чтение данных, потому что, согласно нашему протоколу, клиент не знает, сколько байтов он должен прочитать, и читает до тех пор, пока не встретит символ
#0
.

Листинг 2.17. Обработчик нажатия кнопки Отправить

procedure TSimpleClientForm.BtnSendClick(Sender: TObject);

const

 // Данные из буфера сокета мы будем читать порциями.

 // константа BufStep определяет размер порции

 BufStep = 10;

var

 Str: string

 StrLen, BufStart, Portion: Integer;

 Buf: array of Char;

begin

 Str := EditStringToSend.Text;

 StrLen := Length(Str);

 if StrLen = 0 then

 begin

MessageDlg('Протокол
не допускает отправки пустых строк',

mtError, [mbOK], 0);

Exit;

 end;

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

 if send(FSocket, StrLen, SizeOf(StrLen), 0) < 0 then

 begin

MessageDlg('Ошибка при отправке данных серверу '#13#10 +

GetErrorString, mtError, [mbOK], 0);

OnDisconnect;

Exit;

 end;

 // Отправляем серверу строку

 if send(FSocket, Str[1], StrLen, 0) < 0 then

 begin

MessageDlg('Ошибка при отправке данных серверу: '#13#10 +

GetErrorString, mtError, [mbOK], 0);

OnDisconnect;

Exit;

 end;

 BufStart := 0;

 // Цикл получения ответа от сервера

 // завершается, когда получаем посылку, оканчивающуюся на #0

 repeat

SetLength(Buf, Length(Buf) + BufStep);

// Читаем очередную порцию ответа от сервера

Portion := recv(FSocket, Buf(BufStart), BufStep, 0);

if Portion <= 0 then

begin

MessageDlg('Ошибка при получении ответа от сервера: '#13#10 +

GetErrorString, mtError, [mbOK], 0);

OnDisconnect;

Exit;

end;

// Если порция кончается на #0, ответ прочитан полностью, выходим из

// цикла. Здесь мы использовали особенность нашего протокола, который

// запрещает серверу присылать несколько строк подряд, следующая

// строка будет выслана сервером только после нового запроса от

// клиента. Если бы протокол допускал отправку сервером нескольких

// ответов подряд, при чтении очередной порции данных могло бы

// оказаться, что начало порции принадлежит одной строке, конец -

// следующей, а признак конца строки нужно искать где-то в середине

if Buf[BufStart + Portion - 1] = #0 then

Поделиться:
Популярные книги

Жалкая

Макинтайер Эмили
3. Долго и Несчастливо
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Жалкая

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Академия проклятий. Книги 1 - 7

Звездная Елена
Академия Проклятий
Фантастика:
фэнтези
8.98
рейтинг книги
Академия проклятий. Книги 1 - 7

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сердце для стража

Каменистый Артем
5. Девятый
Фантастика:
фэнтези
боевая фантастика
9.20
рейтинг книги
Сердце для стража

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Как я строил магическую империю 5

Зубов Константин
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5

Блуждающие огни 2

Панченко Андрей Алексеевич
2. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Блуждающие огни 2

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Маленькая слабость Дракона Андреевича

Рам Янка
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Маленькая слабость Дракона Андреевича