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

// Как обычно, "ошибку" WSAEWOULDBLOCK просто игнорируем

if WSAGetLastError <> WSAEWOULDBLOCK then

begin

AddMessageToLog('Ошибка при получении данных от клиента ', +

Connection.ClientAddr + ': ' + GetErrorString);

 RemoveConnection;

 Exit;

end;

end

else if Connection.Phase = tpSendString then

// Если сервер находится на этапе отправки данных,

 // а событие FD_READ все же произошло, отмечаем это

 Connection.SendRead:= True;

 end;

 FD_WRITE: begin

if Connection.Phase = tpSendString then

 begin

// При наступлении события FD_WRITE проверяем, находится ли

 // сервер на этапе отправки данных, и если да, отправляем их

 Res:=

 send(Connection.ClientSocket, Connection.Msg[Connection.Offset + 1],

 Connection.BytesLeft, 0);

if Res > 0 then

begin

Inc(Connection.Offset, Res);

 Dec(Connection.BytesLeft, Res);

// Если Connections. BytesLeft = 0, значит, строка отправлена

 // полностью.

if Connection.BytesLeft = 0 then

 begin

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

' отправлена строка: ' + Connection.Msg);

// Очищаем строку, просто чтобы сэкономить память

 Connection.Msg:= '';

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

Connection.Phase:= tpReceiveLength;

 // Получено — 0 байт

 Connection.Offset:= 0;

// Осталось прочитать столько, сколько занимает целое число

Connection.BytesLeft:= SizeOf(Integer);

// Если были промежуточные события FD_READ, вызываем их

// снова искусственно

it Connection.SendRead then

begin

PostMessage(Handle, WM_SOCKETMESSAGE, Msg.Socket, FD_READ);

 Connection.SendRead:= False;

 end;

 end;

 end

 else if WSAGetLastError <> WSAEWOULDBLOCK then

 begin

AddMessageToLog('Ошибка при отправке данных клиенту ' +

Connection.ClientAddr + ': ' + GetErrorString);

RemoveConnection;

 Exit;

 end;

end;

 end;

 FD_CLOSE: begin

// Клиент вызвал функцию shutdown. Закрываем соединение.

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

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

shutdown(Connection.ClientSocket, SD_BOTH);

 RemoveConnection;

 end

 else

 begin

AddMessageToLog('Неверное событие при обмене с клиентом ' +

Connection.ClientAddr);

 RemoveConnection;

 end;

 end;

end;

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

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

1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных