ну вот полный пример
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.
естественно проверка состояния сокета для не блокируемых сокетов (событийных) это только для примера. там и так ясно когда клиент туту.