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

procedure TServerForm.ProcessConnection(Index: Integer);

var

 // Вспомогательная переменная, чтобы не приводить каждый раз

 // FConnections[Index] к PConnection

 Connection: PConnection;

 // Результат вызова recv и send

 Res: Integer;

 // Вспомогательная процедура, освобождающая ресурсы, связанные

 // с клиентом и удаляющая запись подключения из списка

 procedure RemoveConnection;

 begin

  closesocket(Connection.ClientSocket);

  Dispose(Connection);

  FConnections.Delete(Index);

 end;

begin

 Connection := PConnection(PConnections[Index]);

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

 // Используется оператор if, а не case, потому, что в случае case

 // выполняется только одна альтернатива, а в нашем случае в ходе

 // выполнения этапа он может завершиться, и взаимодействие

 // перейдет к следующему этапу. Использование if позволяет выполнить

 // все три этапа, если это возможно, а не один из них.

 if Connection.Phase = tpReceiveLength then

 begin

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

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

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

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

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

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

  // загружая оставшиеся байты. Connection.Offset — количество

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

  // смещением, начиная с которого заполняется буфер.

  Res := recv(Connection.ClientSocket, (PChar(@Connection.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;

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

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

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

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

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

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

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

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

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

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

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

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

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