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

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

Жанры

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

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

Шрифт:

 ClientSocket: TSocket;

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

 ClientAddr: TSockAddr;

 ClientAddrLen: Integer;

 NetEvents: TWSANetworkEvents;

 I: Integer;

 WaitRes: Cardinal;

begin

 LogMessage('Сервер начал работу');

 // Начинаем бесконечный цикл

 repeat

//
Ожидание события с 15-секундным тайм-аутом

WaitRes :=

WSAWaitForMultipleEvents(2, @FEvents, False, 15000, False);

case WaitRes of

WSA_WAIT_EVENT_0:

// Событие FEvents[0] взведено - это означает, что

// сервер должен остановиться.

begin

LogMessage('Сервер получил сигнал завершения работы');

// Просто выходим из цикла, остальное сделает код после цикла

Break;

end;

WSA_WAIT_EVENT_0 + 1:

// Событие FEvents[1] взведено.

// Это должно означать наступление события FD_ACCEPT.

begin

// Проверяем, почему событие взведено,

// и заодно сбрасываем его

if WSAEnumNetworkEvents(FServerSocket, FEvents[1], NetEvents) = SOCKET_ERROR then

begin

LogMessage('Ошибка при получении списка событий: ' +

GetErrorString);

Break;

end;

// Защита от "тупой" ошибки - проверка того,

// что наступило нужное событие

if NetEvents.lNetworkEvents and FD_ACCEPT = 0 then

begin

LogMessage(

'Внутренняя ошибка сервера - неизвестное событие');

Break;

end;

// Проверка, не было ли ошибок

if NetEvents.iErrorCode[FD_ACCEPT_BIT] <> 0 then

begin

LogMessage('Ошибка при подключении клиента: ' +

GetErrorString(NetEvents.iErrorCode[FD_ACCEPT_BIT]));

Break;

end;

ClientAddrLen := SizeOf(ClientAddr);

// Проверяем наличие подключения

ClientSocket :=

accept(FServerSocket, @ClientAddr, @ClientAddrLen);

if ClientSocket = INVALID_SOCKET then

begin

//
Ошибка в функции accept возникает только тогда, когда

// происходит нечто экстраординарное. Продолжать работу

// в этом случае бессмысленно. Единственное возможное

// в нашем случае исключение - ошибка WSAEWOULDBLOCK,

// которая может возникнуть, если срабатывание события

// было ложным, и подключение от клиента отсутствует

if WSAGetLastError <> WSAEWOULDBLOCK then

begin

LogMessage('Ошибка при подключении клиента: ' +

GetErrorString);

Break;

end;

end;

// Создаем новую нить для обслуживания подключившегося клиента

// и передаем ей сокет, созданный для взаимодействия с ним.

// Указатель на нить сохраняем в списке

FClientThreads.Add(

TClientThread.Create(ClientSocket, ClientAddr));

end;

WSA_WAIT_TIMEOUT:

// Ожидание завершено по тайм-ауту

begin

// Проверяем, есть ли клиентские нити, завершившие работу.

// Если есть такие нити, удаляем их из списка

// и освобождаем объекты

for I := FClientThreads.Count -1 downto 0 do

if TClientThread(FClientThreads[I]).Finished then

begin

TClientThread(FClientThreads[I]).Free;

FClientThreads.Delete(I);

end;

// Если разрешены сообщения от сервера, отправляем

// всем клиентам сообщение с текущим временем

if FServerMsg then

for I := 0 to FClientThreads.Count - 1 do

TClientThread(FClientThreads[I]).SendString(

'Время на сервере ' + TimeToStr(Now));

end;

WSA_WAIT_FAILED:

// При ожидании возникла ошибка. Это может означать

// только какой-то серьезный сбой в библиотеке сокетов.

begin

LogMessage('Ошибка при ожидании события сервера: ' +

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

Жалкая

Макинтайер Эмили
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
рейтинг книги
Маленькая слабость Дракона Андреевича