Читаем О чём не пишут в книгах по Delphi полностью

 if Connection = nil then

 begin

  AddMessageToLog(

   'Внутренняя ошибка сервера — не найдено соединение для сокета');

  Exit;

 end;

 // Проверяем, были ли ошибки при взаимодействии

 if Msg.SockError <> 0 then

 begin

  AddMessageToLog('Ошибка при взаимодействии с клиентом ' +

   Connection.ClientAddr + ': ' + GetErrorString(Msg.SockError));

  RemoveConnection;

  Exit;

 end;

 // Анализируем, какое событие произошло

 case Msg.SockEvent of

 FD_READ: begin

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

  if Connection.Phase = tpReceiveLength then

  begin

   // Этап получения от клиента длины строки. При выполнении этого

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

   // в поле Connection.MsgSize. Здесь приходится учитывать, что

   // теоретически даже такая маленькая (4 байта) посылка может

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

   // этап не будет завершен, и второй раз его придется

   // продолжать, загружая оставшиеся байты. Connection.Offset -

   // количество уже прочитанных на данном этапе байтов -

   // одновременно является смещением, начиная с которого

   // заполняется буфер.

   Res := recv(Connection.ClientSocket,

    (PChar((PConnection.MsgSize + Connection.Offset)^, Connection.BytesLeft, 0);

   if Res > 0 then

   begin

    // Если Res > 0, это означает, что получено Res байтов.

    // Соответственно, увеличиваем на Res количество прочитанных

    // на данном этапе байтов и на такую же величину уменьшаем

    // количество оставшихся.

    Inc(Connection.Offset, Res);

    Dec(Connection.BytesLeft, Res);

    // Если количество оставшихся байтов равно нулю, нужно

    // переходить к следующему этапу.

    if Connection.BytesLeft = 0 then

    begin

     // Проверяем корректность принятой длины строки

     if Connection.MsgSize <= 0 then

     begin

      AddMessageToLog('Неверная длина строки, от клиента ' +

       Connection.ClientAddr + ': ' + IntToStr(Connection.MsgSize));

      RemoveConnection;

      Exit;

     end;

     // Следующий этап - это чтение самой строки

     Connection.Phase := tpReceiveString;

     // Пока на этом этапе не прочитано ни одного байта

     Connection.Offset := 0;

     // Осталось прочитать Connection.MsgSize байтов

     Connection.BytesLeft := Connection.MsgSize;

     // Сразу выделяем память под строку

     SetLength(Connection.Msg, Connection.MsgSize);

    end;

   end

   elsе if Res = 0 then

   begin

    AddMessageToLog('Клиент ' + Connection.ClientAddr +

     ' закрыл соединение');

    RemoveConnection;

    Exit;

   end

   else

    // Ошибку WSAEWOULDBLOCK игнорируем, т.к. она говорит

    // только о том, что входной буфер сокета пуст, но в целом

    // все в порядке - такое вполне возможно при ложных

    // срабатываниях сообщения

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT