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

на главную

Жанры

О чём не пишут в книгах по 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('Ошибка при ожидании события сервера: ' +

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

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Мама из другого мира. Чужих детей не бывает

Рыжая Ехидна
Королевский приют имени графа Тадеуса Оберона
Фантастика:
фэнтези
8.79
рейтинг книги
Мама из другого мира. Чужих детей не бывает

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Империя ускоряется

Тамбовский Сергей
4. Империя у края
Фантастика:
альтернативная история
6.20
рейтинг книги
Империя ускоряется

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Везунчик. Дилогия

Бубела Олег Николаевич
Везунчик
Фантастика:
фэнтези
попаданцы
8.63
рейтинг книги
Везунчик. Дилогия

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5