![]() |
|
|
|
|
#1
|
|||
|
|||
|
есть клиент-серверное приложение...как в серверной части получить список клиентских машин(компов в сети) и отобразить их к примеру в ListBox. Как можно проще,плиз.
|
|
#2
|
||||
|
||||
|
Если на сокетах то
Код:
procedure addhoststolist(); var i: integer; begin for i:=0 to server.Socket.ActiveConnections-1 do begin setlength(ips, inc(p)-1); listbox1.items.add(server.Socket.Connections[i].RemoteAddress); end; end; Так у тебя будет листбокс со всеми клиентами. Последний раз редактировалось T-dayne, 30.06.2010 в 15:44. |
|
#3
|
||||
|
||||
|
Код:
function FillNetLevel(xxx: PNetResource; List: TListItems): Word;
type
PNRArr = ^TNRArr;
TNRArr = array[0..59] of TNetResource;
var
x: PNRArr;
tnr: TNetResource;
I: integer;
EntrReq, SizeReq, twx: THandle;
WSName: string;
LI: TListItem;
begin
Result := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER, xxx, twx);
if Result = ERROR_NO_NETWORK then
Exit;
if Result = NO_ERROR then
begin
New(x);
EntrReq := 1;
SizeReq := SizeOf(TNetResource) * 59;
while (twx <> 0) and
(WNetEnumResource(twx, EntrReq, x, SizeReq) <> ERROR_NO_MORE_ITEMS) do
begin
for i:=0 to EntrReq - 1 do
begin
Move(x^[i], tnr, SizeOf(tnr));
case tnr.dwDisplayType of
RESOURCEDISPLAYTYPE_SERVER:
begin
if tnr.lpRemoteName <> '' then
WSName := tnr.lpRemoteName
else
WSName := tnr.lpComment;
LI := list.Add;
Application.ProcessMessages;
LI.Caption := UpperFirstChar(copy(WSName, 3, length(WSName) - 2));
if Length(tnr.lpComment) = 0 then LI.SubItems.Add('НЕТ ОПИСАНИЯ') else LI.SubItems.Add(tnr.lpComment);
end;
else
FillNetLevel(@tnr, list);
end;
end;
end;
Dispose(x);
WNetCloseEnum(twx);
end;
end;Код:
FillNetLevel(nil,ListView1.Items); Последний раз редактировалось Marvel, 30.06.2010 в 15:50. |
|
#4
|
|||
|
|||
|
пробовал оба.че т не идет у мя(
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, DateUtils, StdCtrls;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
private
{ Private declarations }
public
{ Public declarations }
end;
TServerThread = class(TServerClientThread) // клас многопоточного сервера
protected
procedure ClientExecute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TServerThread.ClientExecute;
var
bufIn: array [0..65535] of Char; // буфер для входящих данных
fRSData: TWinSocketStream; // клиентский поток
buf_size: integer; // размер входящего буфера
bufOut: TMemoryStream; // приёмный буфер в памяти
begin
bufOut := TMemoryStream.Create; // создаём приёмный буфер в памяти
inherited // наследуем все свойства от родителя
FreeOnTerminate := True; // освобождать память при завершении потока
fRSData := TWinSocketStream.Create(ClientSocket, 100000); // создаём клиентский
try
while (not Terminated) And (ClientSocket.Connected) do // работаем пока есть коннект или пока не закрылись
begin
if fRSData.WaitForData(12000) = False then Break; // если за 2 минуты ничего не пришло, закрывает поток
buf_size := ClientSocket.ReceiveLength; // размер входящего буфера
if buf_size = 0 then Break; // если входящий буфер = 0, то закрываемся
fRSData.ReadBuffer(bufIn,buf_size); // читаем буфер
BufOut.Write(bufIn,buf_size); // пишем буфер в память, для последующего сохранения в файл
bufOut.SaveToFile('LogForServer.txt'); // сохраняем лог
bufOut.Free; // освобождаем память от данных
end;
except
on e:exception do // если произошла ошибка
begin
ClientSocket.Close; // закрываем соединение с клиентом
Terminate; // остановка
end;
end;
fRSData.Free; // освобождаем память от клиентского потока
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := True; // активируем серверную часть
end;
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TServerThread.Create(False, ClientSocket); // создаём отдельный поток
SocketThread.Priority := tpLower; // ставим ему низкий приоритет, высокий не нужен
end;
end. |
|
#5
|
|||
|
|||
|
твой код марвел)
|
|
#6
|
||||
|
||||
|
вижу, доделываю бред твоего профессора в данный момент ))
P.S.: если у тя в сети закрыт NETBIOS, то ты не узнаешь какие компы есть, тока сканировать диапазон IP. И не забывай ставить тэги, Admin не дремлет )) |
|
#7
|
|||
|
|||
|
я 2 пункта первых сделал..нада 3,4(
http://ifolder.ru/18365809 а 3 пункст методом T-Dayne мона?)простота привлекает) |