Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Socket.Data   Найти похожие ветки 

 
DrimS ©   (2003-08-08 14:37) [0]

У ServerSocket есть свойство DATA типа Pointer, хотелось бы при подключении клиента к серверу в это свойство записывать некоторуюю информацию и потом ее использовать. Видел такой пример там присваивание идет в событии OnGetSocket, а потом используется где угодно. Например можно было бы вытаскивать информацию по каждому подключению в цикле... если есть пример с этим свойством, прошу описать или прислать на почту...


 
panov ©   (2003-08-08 14:43) [1]

TCustomWinSocket.Data - обычный указатель.
Присваиваешь ему ссылку на Record(например) и работаешь.
Конечно, надо не забывать выделять и удалять память под структуры или перменные, которые используются.
Самый простой пример: Data используется для идентификации.

Хотя в этом примере есть неправильность(Нарушение уникальности при удалении из SockList).

unit Unit1;

interface

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

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SockList: TList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SockList := TList.Create;
ServerSocket1.Port := 5000;
ServerSocket1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SockList.Free;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.Data := pointer(SockList.Add(Socket));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Sock: TCustomWinSocket;
begin
if SockList.Count=0 then
begin
ShowMessage("No active connections!");
Exit;
end;
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Integer(Sock.Data)=1 then
begin
Sock.SendText("Socket N "+IntToStr(i));
Exit;
end;
end;
ShowMessage("Socket not found!");
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i: Integer;
Sock: TCustomWinSocket;
begin
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Sock=Socket then
begin
SockList.Delete(i);
Exit;
( "Disconnect:Socket not found!") TCustomWinSocket.Data - обычный указатель.
Присваиваешь ему ссылку на Record(например) и работаешь.
Конечно, надо не забывать выделять и удалять память под структуры или перменные, которые используются.
Самый простой пример: Data используется для идентификации.

Хотя в этом примере есть неправильность(Нарушение уникальности при удалении из SockList).

unit Unit1;

interface

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

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SockList: TList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SockList := TList.Create;
ServerSocket1.Port := 5000;
ServerSocket1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SockList.Free;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.Data := pointer(SockList.Add(Socket));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Sock: TCustomWinSocket;
begin
if SockList.Count=0 then
begin
ShowMessage("No active connections!");
Exit;
end;
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Integer(Sock.Data)=1 then
begin
Sock.SendText("Socket N "+IntToStr(i));
Exit;
end;
end;
ShowMessage("Socket not found!");
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i: Integer;
Sock: TCustomWinSocket;
begin
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Sock=Socket then
begin
SockList.Delete(i);
Exit;
end;
end;
ShowMessage("Disconnect:Socket not found!");
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
14-18548
ie
2003-09-16 14:36
2003.10.06
вот


1-18315
Support1
2003-09-23 20:44
2003.10.06
---|Ветка была без названия|---


7-18645
Новичек2
2003-07-23 18:18
2003.10.06
Не видно данные из com порта.


14-18542
A_n_d_y!!!
2003-08-29 11:33
2003.10.06
Ищю толкового програмиста


3-18229
Sergey B.
2003-09-17 16:41
2003.10.06
AdoTable.Cancel не работает.