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

 // поэтому ошибку WSAEWOULDBLOCK мы просто игнорируем. Прочие же

 // ошибки могут произойти только в случае серьезных проблем,

 // которые требуют остановки сервера.

 if WSAGetLastError <> WSAEWOULDBLOCK then

 begin

MessageDlg('Ошибка при подключении клиента:'#13#10 + GetErrorString +

#13#10'Сервер будет остановлен', mtError, [mbOK], 0);

 ClearConnections;

 closesocket(FServerSocket);

 OnStopServer;

 end;

 end

 else

 begin

// связываем сообщение с новым сокетом

 if WSAAsyncSelect(ClientSocket, Handle, WM_SOCKETMESSAGE,

 FD_READ or FD_WRITE or FD_CLOSE) = SOCKET_ERROR then

begin

MessageDlg('Ошибка при установке асинхронного режима ' +

 'подключившегося сокета:'#13#10 +

GetErrorString, mtError, [mbOK], 0);

 closesocket(ClientSocket);

 Exit;

 end;

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

 New(NewConnection);

NewConnection.ClientSocket:= ClientSocket;

 NewConnection.ClientAddr:= Format('%u.%u.%u.%u.%u', [

 Ord(ClientAddr.sin_addr.S_un_b.s_b1),

 Ord(ClientAddr.sin_addr.S_un_b.s_b2),

 Ord(ClientAddr.sin_addr.S_un_b.s_b3),

 Ord(ClientAddr.sin_addr.S_un_b.s_b4),

 ntohs(ClientAddr.sin_port)]);

 NewConnection.Phase:= tpReceiveLength;

 NewConnection.Offset:= 0;

 NewConnection.BytesLeft:= SizeOf(Integer);

 NewConnection.SendRead:= False;

 // Добавляем запись нового соединения в список

 FConnections.Add(NewConnection);

AddMessageToLog('Зафиксировано подключение с адреса ' +

NewConnection.ClientAddr);

 end;

end;

Для каждого подключившегося клиента создается запись типа TConnection, указатель на которую добавляется в список FConnections — здесь полная аналогия с сервером на неблокирующих сокетах. Отличие заключается в том, что в типе TConnection по сравнению с тем сервером (см. листинг 2.31) добавилось поле SendRead логического типа. Оно равно True, если возникло событие FD_READ в то время, как сервер находится на этапе отправки данных.

Каждый сокет, созданный функцией accept, связывается с сообщением WM_SOCKETMESSAGE. Обработчик этого сообщения приведен в листинге 2.54.

Листинг 2.54. Обработчик сообщения WM_SOCKETMESSAGE

// Метод GetConnectionBySocket находит в списке FConnections

// запись, соответствующую данному сокету

function TServerForm.GetConnectionBySocket(S: TSocket): PConnection;

var

 I: Integer;

begin

 for I:= 0 to FConnections.Count — 1 do

if PConnection(FConnections[I]).ClientSocket = S then

 begin

Result:= FConnections[I];

 Exit;

 end;

 Result:= nil;

end;

procedure TServerForm.WMSocketMessage(var Msg: TWMSocketMessage);

var

 Connection: PConnection;

 Res: Integer;

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

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

 procedure RemoveConnection;

 begin

closesocket(Connection.ClientSocket);

FConnections.Remove(Connection);

Dispose(Connection);

 end;

begin

 // Ищем соединение по сокету

 Connection:= GetConnectionBySocket(Msg.Socket);

 if Connection = nil then

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

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

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

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

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

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