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

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

?? jsocket.pas

?? 原版翎風(LF)引擎(M2)源碼(Delphi)
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
  FActiveThreads := TList.Create;
  FListLock := TCriticalSection.Create;
  inherited Create(ASocket);
  FAsyncStyles := [asAccept];
end;

destructor TServerWinSocket.Destroy;
begin
  inherited Destroy;
  FConnections.Free;
  FActiveThreads.Free;
  FListLock.Free;
end;

procedure TServerWinSocket.AddClient(AClient: TServerClientWinSocket);
begin
  FListLock.Enter;
  try
    if FConnections.IndexOf(AClient) < 0 then
      FConnections.Add(AClient);
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.RemoveClient(AClient: TServerClientWinSocket);
begin
  FListLock.Enter;
  try
    FConnections.Remove(AClient);
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.AddThread(AThread: TServerClientThread);
begin
  FListLock.Enter;
  try
    if FActiveThreads.IndexOf(AThread) < 0 then
    begin
      FActiveThreads.Add(AThread);
      if FActiveThreads.Count <= FThreadCacheSize then
        AThread.KeepInCache := True;
    end;
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.RemoveThread(AThread: TServerClientThread);
begin
  FListLock.Enter;
  try
    FActiveThreads.Remove(AThread);
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.ClientEvent(Sender: TObject; Socket: TCustomWinSocket;
  SocketEvent: TSocketEvent);
begin
  case SocketEvent of
    seAccept,
    seLookup,
    seConnecting,
    seListen:
      begin end;
    seConnect: ClientConnect(Socket);
    seDisconnect: ClientDisconnect(Socket);
    seRead: ClientRead(Socket);
    seWrite: ClientWrite(Socket);
  end;
end;

procedure TServerWinSocket.ClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ClientErrorEvent(Socket, ErrorEvent, ErrorCode);
end;

function TServerWinSocket.GetActiveConnections: Integer;
begin
  Result := FConnections.Count;
end;

function TServerWinSocket.GetConnections(Index: Integer): TCustomWinSocket;
begin
  Result := FConnections[Index];
end;

function TServerWinSocket.GetActiveThreads: Integer;
var
  I: Integer;
begin
  FListLock.Enter;
  try
    Result := 0;
    for I := 0 to FActiveThreads.Count - 1 do
      if TServerClientThread(FActiveThreads[I]).ClientSocket <> nil then
        Inc(Result);
  finally
    FListLock.Leave;
  end;
end;

function TServerWinSocket.GetIdleThreads: Integer;
var
  I: Integer;
begin
  FListLock.Enter;
  try
    Result := 0;
    for I := 0 to FActiveThreads.Count - 1 do
      if TServerClientThread(FActiveThreads[I]).ClientSocket = nil then
        Inc(Result);
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.Accept(Socket: TSocket);
var
  ClientSocket: TServerClientWinSocket;
  ClientWinSocket: TSocket;
  Addr: TSockAddrIn;
  Len: Integer;
  OldOpenType, NewOpenType: Integer;
begin
  Len := SizeOf(OldOpenType);
  if getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType),
    Len) = 0 then
  try
    if FServerType = stThreadBlocking then
    begin
      NewOpenType := SO_SYNCHRONOUS_NONALERT;
      setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@NewOpenType), Len);
    end;
    Len := SizeOf(Addr);
    ClientWinSocket := WinSock.accept(Socket, @Addr, @Len);
    if ClientWinSocket <> INVALID_SOCKET then
    begin
      ClientSocket := GetClientSocket(ClientWinSocket);
      if Assigned(FOnSocketEvent) then
        FOnSocketEvent(Self, ClientSocket, seAccept);
      if FServerType = stThreadBlocking then
      begin
        ClientSocket.ASyncStyles := [];
        GetServerThread(ClientSocket);
      end;
    end;
  finally
    Len := SizeOf(OldOpenType);
    setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType), Len);
  end;
end;

procedure TServerWinSocket.Disconnect(Socket: TSocket);
var
  SaveCacheSize: Integer;
begin
  Lock;
  try
    SaveCacheSize := ThreadCacheSize;
    try
      ThreadCacheSize := 0;
      while FActiveThreads.Count > 0 do
        with TServerClientThread(FActiveThreads.Last) do
        begin
          FreeOnTerminate := False;
          Terminate;
          FEvent.SetEvent;
          if (ClientSocket <> nil) and ClientSocket.Connected then
            ClientSocket.Close;
          WaitFor;  
          Free;
        end;
      while FConnections.Count > 0 do
        TCustomWinSocket(FConnections.Last).Free;
      if FServerAcceptThread <> nil then
        FServerAcceptThread.Terminate;
      inherited Disconnect(Socket);
      FServerAcceptThread.Free;
      FServerAcceptThread := nil;
    finally
      ThreadCacheSize := SaveCacheSize;
    end;
  finally
    Unlock;
  end;
end;

function TServerWinSocket.DoCreateThread(ClientSocket: TServerClientWinSocket): TServerClientThread;
begin
  Result := TServerClientThread.Create(False, ClientSocket);
end;

procedure TServerWinSocket.Listen(var Name, Address, Service: string; Port: Word;
  QueueSize: Integer);
begin
  inherited Listen(Name, Address, Service, Port, QueueSize, ServerType = stThreadBlocking);
  if FConnected and (ServerType = stThreadBlocking) then
    FServerAcceptThread := TServerAcceptThread.Create(False, Self);
end;

procedure TServerWinSocket.SetServerType(Value: TServerType);
begin
  if Value <> FServerType then
    if not FConnected then
    begin
      FServerType := Value;
      if FServerType = stThreadBlocking then
        ASyncStyles := []
      else ASyncStyles := [asAccept];
    end else raise ESocketError.CreateRes(@sCantChangeWhileActive);
end;

procedure TServerWinSocket.SetThreadCacheSize(Value: Integer);
var
  Start, I: Integer;
begin
  if Value <> FThreadCacheSize then
  begin
    if Value < FThreadCacheSize then
      Start := Value
    else Start := FThreadCacheSize;
    FThreadCacheSize := Value;
    FListLock.Enter;
    try
      for I := 0 to FActiveThreads.Count - 1 do
        with TServerClientThread(FActiveThreads[I]) do
          KeepInCache := I < Start;
    finally
      FListLock.Leave;
    end;
  end;
end;

function TServerWinSocket.GetClientSocket(Socket: TSocket): TServerClientWinSocket;
begin
  Result := nil;
  if Assigned(FOnGetSocket) then FOnGetSocket(Self, Socket, Result);
  if Result = nil then
    Result := TServerClientWinSocket.Create(Socket, Self);
end;

procedure TServerWinSocket.ThreadEnd(AThread: TServerClientThread);
begin
  if Assigned(FOnThreadEnd) then FOnThreadEnd(Self, AThread);
end;

procedure TServerWinSocket.ThreadStart(AThread: TServerClientThread);
begin
  if Assigned(FOnThreadStart) then FOnThreadStart(Self, AThread);
end;

function TServerWinSocket.GetServerThread(ClientSocket: TServerClientWinSocket): TServerClientThread;
var
  I: Integer;
begin
  Result := nil;
  FListLock.Enter;
  try
    for I := 0 to FActiveThreads.Count - 1 do
      if TServerClientThread(FActiveThreads[I]).ClientSocket = nil then
      begin
        Result := FActiveThreads[I];
        Result.ReActivate(ClientSocket);
        Break;
      end;
  finally
    FListLock.Leave;
  end;
  if Result = nil then
  begin
    if Assigned(FOnGetThread) then FOnGetThread(Self, ClientSocket, Result);
    if Result = nil then Result := DoCreateThread(ClientSocket);
  end;
end;

function TServerWinSocket.GetClientThread(ClientSocket: TServerClientWinSocket): TServerClientThread;
var
  I: Integer;
begin
  Result := nil;
  FListLock.Enter;
  try
    for I := 0 to FActiveThreads.Count - 1 do
      if TServerClientThread(FActiveThreads[I]).ClientSocket = ClientSocket then
      begin
        Result := FActiveThreads[I];
        Break;
      end;
  finally
    FListLock.Leave;
  end;
end;

procedure TServerWinSocket.ClientConnect(Socket: TCustomWinSocket);
begin
  if Assigned(FOnClientConnect) then FOnClientConnect(Self, Socket);
end;

procedure TServerWinSocket.ClientDisconnect(Socket: TCustomWinSocket);
begin
  if Assigned(FOnClientDisconnect) then FOnClientDisconnect(Self, Socket);
  if ServerType = stNonBlocking then Socket.DeferFree;
end;

procedure TServerWinSocket.ClientRead(Socket: TCustomWinSocket);
begin
  if Assigned(FOnClientRead) then FOnClientRead(Self, Socket);
end;

procedure TServerWinSocket.ClientWrite(Socket: TCustomWinSocket);
begin
  if Assigned(FOnClientWrite) then FOnClientWrite(Self, Socket);
end;

procedure TServerWinSocket.ClientErrorEvent(Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  if Assigned(FOnClientError) then FOnClientError(Self, Socket, ErrorEvent, ErrorCode);
end;

{ TServerAcceptThread }

constructor TServerAcceptThread.Create(CreateSuspended: Boolean;
  ASocket: TServerWinSocket);
begin
  FServerSocket := ASocket;
  inherited Create(CreateSuspended);
end;

procedure TServerAcceptThread.Execute;
begin
  while not Terminated do
    FServerSocket.Accept(FServerSocket.SocketHandle);
end;

{ TServerClientThread }

constructor TServerClientThread.Create(CreateSuspended: Boolean;
  ASocket: TServerClientWinSocket);
begin
  FreeOnTerminate := True;
  FEvent := TSimpleEvent.Create;
  inherited Create(True);
  Priority := tpHigher;
  ReActivate(ASocket);
  if not CreateSuspended then Resume;
end;

destructor TServerClientThread.Destroy;
begin
  FClientSocket.Free;
  FEvent.Free;
  inherited Destroy;
end;

procedure TServerClientThread.ReActivate(ASocket: TServerClientWinSocket);
begin
  FClientSocket := ASocket;
  if Assigned(FClientSocket) then
  begin
    FServerSocket := FClientSocket.ServerWinSocket;
    FServerSocket.AddThread(Self);
    FClientSocket.OnSocketEvent := HandleEvent;
    FClientSocket.OnErrorEvent := HandleError;
    FEvent.SetEvent;
  end;
end;

procedure TServerClientThread.DoHandleException;
begin
  if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
  if FException is Exception then
  begin
    if Assigned(ApplicationShowException) then
      ApplicationShowException(FException);
  end else
    SysUtils.ShowException(FException, nil);
end;

procedure TServerClientThread.DoRead;
begin
  ClientSocket.ServerWinSocket.Event(ClientSocket, seRead);
end;

procedure TServerClientThread.DoTerminate;
begin
  inherited DoTerminate;
  if Assigned(FServerSocket) then
    FServerSocket.RemoveThread(Self);
end;

procedure TServerClientThread.DoWrite;
begin
  FServerSocket.Event(ClientSocket, seWrite);
end;

procedure TServerClientThread.HandleEvent(Sender: TObject; Socket: TCustomWinSocket;
  SocketEvent: TSocketEvent);
begin
  Event(SocketEvent);
end;

procedure TServerClientThread.HandleError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Error(ErrorEvent, ErrorCode);
end;

procedure TServerClientThread.Event(SocketEvent: TSocketEvent);
begin
  FServerSocket.ClientEvent(Self, ClientSocket, SocketEvent);
end;

procedure TServerClientThread.Error(ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  FServerSocket.ClientError(Self, ClientSocket, ErrorEvent, ErrorCode);
end;

procedure TServerClientThread.HandleException;
begin
  FException := Exception(ExceptObject);
  try
    if not (FException is EAbort) then
      Synchronize(DoHandleException);
  finally
    FException := nil;
  end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久久免费一区二区| 日本麻豆一区二区三区视频| 国产乱码精品1区2区3区| 91精品国产高清一区二区三区 | 欧美视频中文字幕| 一区二区三区在线视频观看58 | 欧美性欧美巨大黑白大战| 国产精品久久久久久久久晋中| 亚洲精品少妇30p| 一本色道久久综合亚洲aⅴ蜜桃| 欧美精品xxxxbbbb| 极品美女销魂一区二区三区| 久久综合久色欧美综合狠狠| 国产成人精品免费在线| 亚洲日本va午夜在线影院| 欧美亚洲动漫制服丝袜| 日韩主播视频在线| 久久综合久色欧美综合狠狠| 国产成人综合网| 一区二区三区日韩精品| 欧美一级欧美三级在线观看| 极品尤物av久久免费看| 中文字幕视频一区二区三区久| 国内一区二区在线| 亚洲蜜臀av乱码久久精品蜜桃| 日韩va欧美va亚洲va久久| 日韩欧美亚洲国产另类| 成人看片黄a免费看在线| 亚洲一区在线观看免费观看电影高清| 成人免费视频网站在线观看| 亚洲女人的天堂| 日韩一级大片在线| 99久久夜色精品国产网站| 一区二区三区免费网站| 欧美变态凌虐bdsm| 色视频成人在线观看免| 精品一区二区三区免费| 樱桃国产成人精品视频| 精品国产乱码久久久久久图片 | 91精品国产一区二区三区蜜臀| 最新国产成人在线观看| 日韩一区和二区| 91免费看视频| 紧缚捆绑精品一区二区| 亚洲一二三区视频在线观看| 2020国产成人综合网| 欧美一区二区在线看| 色先锋资源久久综合| 国产xxx精品视频大全| 日本vs亚洲vs韩国一区三区| 中文字幕在线观看一区| 久久天堂av综合合色蜜桃网| 欧美美女一区二区三区| 91论坛在线播放| 成人毛片在线观看| 国产精品18久久久久久vr| 久久国产三级精品| 日本一不卡视频| 五月天丁香久久| 亚洲高清不卡在线| 夜夜精品视频一区二区| 中文字幕一区二区三区四区不卡| 色婷婷综合视频在线观看| 国产麻豆成人精品| 久久精品国产亚洲一区二区三区| 欧美成人r级一区二区三区| 欧美另类高清zo欧美| 欧美视频在线观看一区| 欧美优质美女网站| 欧美网站一区二区| 日本道在线观看一区二区| 94-欧美-setu| 一本一道久久a久久精品| 91免费看片在线观看| 91浏览器打开| 在线中文字幕一区| 欧美色图第一页| 色激情天天射综合网| 91九色最新地址| 欧美日韩精品一区二区三区| 在线观看国产日韩| 欧美美女视频在线观看| 欧美一区二区黄| www国产成人免费观看视频 深夜成人网| 99在线精品一区二区三区| 成人手机在线视频| 色999日韩国产欧美一区二区| 天天色图综合网| 午夜精品久久久久久久蜜桃app| wwwwxxxxx欧美| 亚洲国产精华液网站w| 中文字幕第一区二区| 国产精品不卡在线观看| 亚洲一区二区三区四区五区中文 | 国产精品人人做人人爽人人添 | 欧美日韩三级一区二区| 欧美日韩亚洲综合在线| 欧美一区二区三区四区视频 | 在线观看免费亚洲| 欧美一区二区私人影院日本| 精品国产乱码久久| 国产精品视频一二三区| 有码一区二区三区| 麻豆精品视频在线观看免费| 久久成人久久爱| 北岛玲一区二区三区四区| 91传媒视频在线播放| 91精品国产91久久久久久一区二区| 99久久精品国产麻豆演员表| 日本久久电影网| 5月丁香婷婷综合| 久久天天做天天爱综合色| 亚洲男帅同性gay1069| 日本不卡视频一二三区| 不卡一区二区三区四区| 欧美日韩第一区日日骚| 国产天堂亚洲国产碰碰| 亚洲与欧洲av电影| 国产精品亚洲成人| 欧美日本一区二区| 中文在线一区二区| 日韩精品一二区| 成人精品在线视频观看| 日韩一区二区在线看| 国产精品久久久久婷婷二区次| 久久久久久久久免费| 一区二区三区 在线观看视频| 国产精品乱子久久久久| 日本视频一区二区| 99国产欧美久久久精品| 欧美va在线播放| 亚洲精品福利视频网站| 免费在线观看日韩欧美| 99r国产精品| 久久人人爽人人爽| 丝袜美腿高跟呻吟高潮一区| 99re6这里只有精品视频在线观看| 成人h动漫精品一区二区| 91精品国产全国免费观看| 国产精品免费av| 美女精品一区二区| 欧美视频精品在线| 综合电影一区二区三区 | 国内精品免费在线观看| 色94色欧美sute亚洲线路二 | 高清免费成人av| 日韩欧美二区三区| 午夜激情久久久| 在线观看免费亚洲| 亚洲男人的天堂在线观看| 国产.欧美.日韩| 久久理论电影网| 国内不卡的二区三区中文字幕| 久久 天天综合| 精品视频在线视频| 一区二区三区四区视频精品免费| 偷偷要91色婷婷| 欧美自拍偷拍一区| 综合在线观看色| 91视频在线观看免费| 国产精品传媒视频| 成人高清视频在线观看| 国产农村妇女毛片精品久久麻豆 | 精品电影一区二区三区| 午夜激情综合网| 欧美美女一区二区三区| 亚洲国产精品自拍| 欧美中文一区二区三区| 亚洲男人的天堂在线观看| 91视频www| 亚洲综合激情另类小说区| 色欧美乱欧美15图片| 日韩久久一区二区| www.日韩大片| 午夜精品福利一区二区蜜股av | thepron国产精品| 国产精品久99| 色婷婷精品大在线视频| 亚洲精品免费播放| 欧美色国产精品| 蜜桃精品视频在线观看| 久久综合久久鬼色| 丰满亚洲少妇av| 亚洲精品视频观看| 91精品免费在线| 国产精品亚洲视频| 亚洲男人电影天堂| 欧美一级国产精品| 国产黑丝在线一区二区三区| 一色桃子久久精品亚洲| 欧美亚洲国产一区二区三区| 七七婷婷婷婷精品国产| 久久综合色8888| 色老头久久综合| 久久精品国产亚洲一区二区三区| 色悠悠亚洲一区二区| 五月天丁香久久| 中文字幕国产一区二区| 日本精品视频一区二区| 丝袜美腿亚洲综合|