亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? idudpserver.pas

?? delphi indy9.0.18組件包
?? PAS
字號:
{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence                                   }
{ Team Coherence is Copyright 2002 by Quality Software Components      }
{                                                                      }
{ For further information / comments, visit our WEB site at            }
{ http://www.TeamCoherence.com                                         }
{**********************************************************************}
{}
{ $Log:  10411: IdUDPServer.pas 
{
{   Rev 1.0    2002.11.12 10:59:10 PM  czhower
}
unit IdUDPServer;

interface

uses
  Classes,
  IdComponent, IdException, IdGlobal, IdSocketHandle, IdStackConsts, IdThread, IdUDPBase;

type
  TUDPReadEvent = procedure(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle) of object;

  TIdUDPServer = class;

  TIdUDPListenerThread = class(TIdThread)
  protected
    IncomingData: TIdSocketHandle;
    FAcceptWait: integer;
    FBuffer: TMemoryStream;
    FBufferSize: integer;
  public
    FServer: TIdUDPServer;
    //
    constructor Create(const ABufferSize: integer; Owner: TIdUDPServer); reintroduce;
    destructor Destroy; override;
    procedure Run; override;
    procedure UDPRead;
    //
    property AcceptWait: integer read FAcceptWait write FAcceptWait;
  published
  end;

  TIdUDPServer = class(TIdUDPBase)
  protected
    FBindings: TIdSocketHandles;
    FCurrentBinding: TIdSocketHandle;
    FListenerThread: TIdUDPListenerThread;
    FOnUDPRead: TUDPReadEvent;
    FThreadedEvent: boolean;
    //
    function GetDefaultPort: integer;
    procedure SetBindings(const Value: TIdSocketHandles);
    procedure SetDefaultPort(const AValue: integer);
    procedure PacketReceived(AData: TStream; ABinding: TIdSocketHandle);
    procedure DoUDPRead(AData: TStream; ABinding: TIdSocketHandle); virtual;
    function GetBinding: TIdSocketHandle; override;
    procedure CloseBinding; override;
    procedure BroadcastEnabledChanged; override;
    function GetActive: Boolean; override;
  public
    constructor Create(axOwner: TComponent); override;
    destructor Destroy; override;
    //
  published
    property Bindings: TIdSocketHandles read FBindings write SetBindings;
    property DefaultPort: integer read GetDefaultPort write SetDefaultPort;
    property OnUDPRead: TUDPReadEvent read FOnUDPRead write FOnUDPRead;
    property ThreadedEvent: boolean read FThreadedEvent write FThreadedEvent default False;
  end;
  EIdUDPServerException = class(EIdUDPException);

implementation

uses
  IdResourceStrings, IdStack,
  SysUtils;

{ TIdUDPServer }

procedure TIdUDPServer.BroadcastEnabledChanged;
var
  i: integer;
begin
  if Assigned(FCurrentBinding) then begin
    for i := 0 to Bindings.Count - 1 do begin
      SetBroadcastFlag(BroadcastEnabled, Bindings[i]);
    end;
  end;
end;

procedure TIdUDPServer.CloseBinding;
var
  i: integer;
begin
  if Assigned(FCurrentBinding) then begin
    // Necessary here - cancels the recvfrom in the listener thread
    FListenerThread.Stop;
    for i := 0 to Bindings.Count - 1 do begin
      Bindings[i].CloseSocket;
    end;
    FListenerThread.WaitFor;
    FreeAndNil(FListenerThread);
    FCurrentBinding := nil;
  end;
end;

constructor TIdUDPServer.Create(axOwner: TComponent);
begin
  inherited;
  FBindings := TIdSocketHandles.Create(Self);
end;

destructor TIdUDPServer.Destroy;
begin
  Active := False;
  FreeAndNil(FBindings);
  inherited;
end;

procedure TIdUDPServer.DoUDPRead(AData: TStream; ABinding: TIdSocketHandle);
begin
  if assigned(OnUDPRead) then begin
    OnUDPRead(Self, AData, ABinding);
  end;
end;

function TIdUDPServer.GetActive: Boolean;
begin
  // inherited GetActive keeps track of design-time Active property
  Result := inherited GetActive or
            (Assigned(FCurrentBinding) and FCurrentBinding.HandleAllocated);
end;

function TIdUDPServer.GetBinding: TIdSocketHandle;
var
  i: integer;
begin
  if not Assigned(FCurrentBinding) then
  begin
    if Bindings.Count < 1 then begin
      Bindings.Add;
    end;
    for i := 0 to Bindings.Count - 1 do begin
      Bindings[i].AllocateSocket(Id_SOCK_DGRAM);
      Bindings[i].Bind;
    end;
    FCurrentBinding := Bindings[0];
    FListenerThread := TIdUDPListenerThread.Create(BufferSize, Self);
    FListenerThread.Start;
    BroadcastEnabledChanged;
  end;
  Result := FCurrentBinding;
end;

function TIdUDPServer.GetDefaultPort: integer;
begin
  result := FBindings.DefaultPort;
end;

procedure TIdUDPServer.PacketReceived(AData: TStream;
  ABinding: TIdSocketHandle);
begin
  FCurrentBinding := ABinding;
  DoUDPRead(AData, ABinding);
end;

procedure TIdUDPServer.SetBindings(const Value: TIdSocketHandles);
begin
  FBindings.Assign(Value);
end;

procedure TIdUDPServer.SetDefaultPort(const AValue: integer);
begin
  FBindings.DefaultPort := AValue;
end;

{ TIdUDPListenerThread }

// TODO: get rid of buffersize arg... there's no reason why this thread can't simply check its owner's buffersize property    {Do not Localize}
constructor TIdUDPListenerThread.Create(const ABufferSize: integer; Owner: TIdUDPServer);
begin
  inherited Create(True);
  FAcceptWait := 1000;
  FBuffer := TMemoryStream.Create;
  FBufferSize := ABufferSize;
  FServer := Owner;
end;

destructor TIdUDPListenerThread.Destroy;
begin
  FBuffer.Free;
  inherited;
end;

procedure TIdUDPListenerThread.Run;
var
  PeerIP: string;
  i, PeerPort, ByteCount: Integer;
  FReadList: TList;
begin
  // fill list of socket handles
  FReadList := TList.Create;
  try
    FReadList.Capacity := FServer.Bindings.Count;
    for i := 0 to FServer.Bindings.Count - 1 do begin
      FReadList.Add(Pointer(FServer.Bindings[i].Handle));
    end;
    GStack.WSSelect(FReadList, nil, nil, AcceptWait);
    for i := 0 to FReadList.Count - 1 do try
      // Doublecheck to see if we've been stopped    {Do not Localize}
      // Depending on timing - may not reach here if it is in ancestor run when thread is stopped
      if not Stopped then begin
        IncomingData := FServer.Bindings.BindingByHandle(TIdStackSocketHandle(FReadList[i]));
        FBuffer.SetSize(FBufferSize);
        ByteCount := GStack.WSRecvFrom(IncomingData.Handle, FBuffer.Memory^, FBufferSize,
                                       0, PeerIP, PeerPort);
        GStack.CheckForSocketError(ByteCount);
        FBuffer.SetSize(ByteCount);
        //Some streams alter their position on SetSize
        FBuffer.Position := 0;
        IncomingData.SetPeer(PeerIP, PeerPort);
        if FServer.ThreadedEvent then begin
          UDPRead;
        end else begin
          Synchronize(UDPRead);
        end;
      end;
    except  // exceptions should be ignored so that other clients can be served in case of a DOS attack
    end;
  finally
    FReadList.Free;
  end;
end;

procedure TIdUDPListenerThread.UDPRead;
begin
  FServer.PacketReceived(FBuffer, IncomingData);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜嗨av一区二区三区| 99久久婷婷国产综合精品 | 国产剧情一区二区| 一本一道久久a久久精品| 精品精品国产高清a毛片牛牛| 国产精品高潮久久久久无| 九一久久久久久| 欧美色综合网站| 日韩美女啊v在线免费观看| 国产在线国偷精品免费看| 欧美日韩一区二区三区视频| 亚洲欧美综合另类在线卡通| 黑人精品欧美一区二区蜜桃 | 成人免费毛片app| 日韩欧美一级在线播放| 丝袜亚洲另类丝袜在线| 色吊一区二区三区| 国产精品国产三级国产| 国产成人精品免费网站| 国产精品久久久久久久第一福利| 日韩va欧美va亚洲va久久| 91老师片黄在线观看| 国产精品久久久久久久裸模| 国产成人在线网站| 欧美va亚洲va| 精品一区二区三区日韩| 日韩视频免费观看高清在线视频| 午夜电影网一区| 正在播放亚洲一区| 亚洲妇熟xx妇色黄| 欧美手机在线视频| 亚洲韩国一区二区三区| 欧美日韩在线三级| 天天综合色天天综合色h| 欧美放荡的少妇| 日韩和的一区二区| 日韩精品一区二区三区swag| 首页国产欧美久久| 精品久久久网站| 国产一区二区网址| 国产农村妇女毛片精品久久麻豆| 国产精品99久久久久久久vr| 国产欧美日韩综合精品一区二区| 国产91精品一区二区| 亚洲欧洲精品成人久久奇米网| a美女胸又www黄视频久久| 亚洲欧美色图小说| 在线成人免费观看| 久久精品国内一区二区三区| 久久精品男人天堂av| 激情五月婷婷综合| 国产精品免费丝袜| 一本色道综合亚洲| 日本午夜一本久久久综合| 久久亚洲二区三区| 91一区在线观看| 日韩精品免费视频人成| 亚洲免费看黄网站| 欧美美女bb生活片| 国产精品一区三区| 一区二区三区中文免费| 欧美一区二区三区四区五区| 国产精品1区二区.| 亚洲精品成人悠悠色影视| 欧美一区二区三区在线| 国产伦精品一区二区三区视频青涩| 国产欧美1区2区3区| 欧美日韩在线一区二区| 国产99久久久国产精品潘金网站| 日韩美女视频一区二区| 欧美成人精品二区三区99精品| 成人免费黄色在线| 免费xxxx性欧美18vr| 国产精品国产三级国产aⅴ中文| 欧美日本在线视频| www.在线欧美| 国产在线播精品第三| 亚洲黄色片在线观看| 久久综合色8888| 欧美探花视频资源| 成人app在线观看| 久久福利视频一区二区| 亚洲午夜精品在线| 国产精品久久久久久久久久免费看| 欧美一区二区视频在线观看| 色综合久久中文字幕综合网| 国产综合色在线| 日韩在线一二三区| 一区二区三区中文字幕电影| 国产日韩三级在线| 日韩你懂的在线观看| 欧美综合在线视频| 91视频在线观看免费| 丁香婷婷综合色啪| 国产乱码精品一区二区三| 日本不卡中文字幕| 五月天视频一区| 亚洲综合在线视频| 亚洲三级理论片| 中文在线免费一区三区高中清不卡| 欧美一个色资源| 7878成人国产在线观看| 欧美怡红院视频| 91福利社在线观看| 色婷婷综合视频在线观看| 成人激情午夜影院| 成人精品国产免费网站| 国产a精品视频| 国产盗摄精品一区二区三区在线| 久久国产精品免费| 精品一区二区三区在线观看国产| 免费在线欧美视频| 日本欧美一区二区在线观看| 丝袜a∨在线一区二区三区不卡| 夜夜嗨av一区二区三区| 亚洲成av人片www| 日韩精品成人一区二区在线| 午夜精品一区二区三区免费视频 | 国产精品综合视频| 国内不卡的二区三区中文字幕| 久久精品免费观看| 国产又黄又大久久| 成人综合婷婷国产精品久久蜜臀 | 欧美情侣在线播放| 欧美一卡2卡3卡4卡| 日韩丝袜情趣美女图片| 日韩女优电影在线观看| 久久婷婷国产综合精品青草| 国产精品天美传媒沈樵| 成人欧美一区二区三区| 亚洲欧美色综合| 丝袜诱惑亚洲看片| 国产一区二区在线看| 成人国产精品免费观看动漫| 91色|porny| 91精品福利在线一区二区三区| 欧美成人三级电影在线| 中文字幕欧美激情| 亚洲国产成人av好男人在线观看| 奇米影视7777精品一区二区| 久久9热精品视频| 99精品视频在线观看免费| 欧美日韩精品二区第二页| 精品日韩在线观看| 亚洲视频一区在线| 免费av成人在线| 9人人澡人人爽人人精品| 欧美视频一区在线| 国产亚洲人成网站| 一区二区三区在线视频免费 | 2021国产精品久久精品| 国产精品久久久久久福利一牛影视| 亚洲综合色噜噜狠狠| 久99久精品视频免费观看| 一本色道久久综合狠狠躁的推荐| 7777精品伊人久久久大香线蕉经典版下载| 久久久久久久性| 亚洲午夜免费电影| 国产成人精品亚洲777人妖| 欧美日韩在线综合| 国产精品久久久久一区二区三区共| 亚洲第一福利视频在线| 成人国产精品免费观看动漫| 欧美一区二区三区视频| 中文字幕一区二区三中文字幕| 久久综合综合久久综合| 欧美性受xxxx| 亚洲国产高清aⅴ视频| 老汉av免费一区二区三区| 色综合久久精品| 国产亚洲污的网站| 久久成人18免费观看| 欧美性色aⅴ视频一区日韩精品| 日本一区二区三区高清不卡| 蜜臀久久99精品久久久画质超高清| 色婷婷亚洲一区二区三区| 久久久国际精品| 美女高潮久久久| 欧美精品丝袜中出| 亚洲高清视频在线| 色综合久久99| 综合色天天鬼久久鬼色| 国产成人精品1024| 精品国产人成亚洲区| 日韩精品欧美成人高清一区二区| 一本大道av伊人久久综合| 国产精品久久久久一区二区三区| 国内外成人在线视频| 日韩一区二区三区免费看| 五月婷婷综合在线| 欧美日韩国产影片| 亚洲国产精品一区二区www在线| 91在线观看一区二区| 国产精品成人一区二区艾草| 成人免费视频网站在线观看| 欧美激情中文不卡| 菠萝蜜视频在线观看一区| 国产精品少妇自拍| 9人人澡人人爽人人精品| 亚洲婷婷在线视频|