Тема: WinSock API
Показать сообщение отдельно
  #13  
Старый 28.12.2010, 10:50
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну вот полный пример http://data.cod.ru/82129

-в ASocket храним клиента. изначально он INVALID_SOCKET, т.к. никогда не подключался
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ASocket:=INVALID_SOCKET;
end;

-таймер периодически вызывает CheckSocket и выводит результат в Caption. естественно для никогда не подключавшегося клиента ASocket=INVALID_SOCKET
procedure TForm1.Timer1Timer(Sender: TObject);
Код:
begin
  if CheckSocket(ASocket, 1000) then Caption:='CheckSocket: True' else Caption:='CheckSocket: False';
  Caption:=Caption+' (SocketHandle='+IntToStr(ASocket)+')';
end;

-при нажатии кнопки 1 клиент подключается
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Open;
end;
и на сервере происходит событие. запоминаем в ASocket клиента
Код:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('ClientConnect');
  ASocket:=ServerSocket1.Socket.Connections[0].SocketHandle;
end;
-теперь таймер говорит, что клиент подключен
-когда нажимаем кнопку 3 клиент закрывает соединение
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientSocket1.Close;
end;
и на сервере происходит событие
Код:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('ClientDisconnect');
end;
но в нем не будем трогать ASocket!!! пусть таймер так для этого клиента и проверяет состояние.
-теперь таймер будет говорить False

полный код:

Код:
unit Unit1;

interface

uses
  WinSock,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Timer1: TTimer;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    ClientSocket2: TClientSocket;
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    ASocket: TSocket;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CheckSocket(const ASocket: TSocket; usec: Integer): Boolean;
var
  FDSet: TFDSet;
  TimeVal: TTimeVal;
begin
  if ASocket<>INVALID_SOCKET then
  begin
    FD_ZERO(FDSet);
    FD_SET(ASocket, FDSet);
    TimeVal.tv_sec:=0;
    TimeVal.tv_usec:=usec;
    if select(0, @FDSet, nil, nil, @TimeVal)<>SOCKET_ERROR then Result:=True
    else Result:=False;
  end else Result:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Open;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('ClientConnect');
  ASocket:=ServerSocket1.Socket.Connections[0].SocketHandle;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('ClientDisconnect');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('ClientRead='+Socket.ReceiveText);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ASocket:=INVALID_SOCKET;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if CheckSocket(ASocket, 1000) then Caption:='CheckSocket: True' else Caption:='CheckSocket: False';
  Caption:=Caption+' (SocketHandle='+IntToStr(ASocket)+')';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.Socket.SendText('hello');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientSocket1.Close;
end;

end.

естественно проверка состояния сокета для не блокируемых сокетов (событийных) это только для примера. там и так ясно когда клиент туту.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием