Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблемма при работе с блокирующим сокетом


Автор: Vinni37 9.2.2011, 00:13
Во общем проблема в следующем, у меня северный сокет блокирующий (stThreadBlocking) (Писал этот сервер не я, я пытаюсь с ним только разобраться), у сокета выставлено OnAccept := ClientAccept, в ClientAccept создается поток следующего типа:
Код

TClientThread =
    class (TThread)
      private
        fClientSocket: TCustomWinSocket;
        Function SendPacket(Reply: pPacket; ReplyData: pointer = nil): Bool;
      public
      protected
        procedure Execute; override;
    end;

Куда в fClientSocket записывается TCustomWinSocket который передается при OnAccept.
После старта нового потока в Execute происходит в цикле while чтение из сокета что то типа этого:
Код

While fClientSocket.ReceiveBuf(Request, SizeOf(TPacket)) = SizeOf(TPacket) do
  begin
     //тут обрабатывается запрос
  end;

Собственно 99% времени сокет находится в заблокированном состоянии ожидая запроса от  клиента.
Вот тут то и возникает проблема что иногда требуется отправить клиенту пакет для этого вызывается SendPacket клиентского потока, и как только дело доходит до fClientSocket.SendBuf он естественно зависает так как первым было вызвано чтение из сокета, и отправка идет только когда клиент что нибудь пришлет. Как это обойти при использовании блокирующих сокетов. За ранее спасибо.

Автор: MetalFan 9.2.2011, 09:53
емнип, у TCustomWinSocket есть функции проверки, есть ли что в буффере входящем. Точно не скажу, как называются - делфи под рукой нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)