![]() |
|
|
#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 мона?)простота привлекает) |
|
#8
|
||||
|
||||
|
по методу T-Dayne ты получишь список клиентов подключенных к серверу, а т.к. клиент подключается раз в 10 минут, сбрасывает инфу и отключается, то постоянных подключенных клиентов не будет, список будет почти всегда пуст
Тут надо в каждый клиент встраивать маленький сервер, чтобы при обращении к клиенту можно было получать данные о нём когда нужно, ИЛИ делать так, что бы клиент при подключении не отключался, а всегда висел, тогда с него можно будет получать инфу (типо как аська)Последний раз редактировалось Marvel, 30.06.2010 в 16:07. |
|
#9
|
|||
|
|||
|
А что, собирать информацию в момент подключения клиента очень тяжело? В момент подключения клиента просто заносишь его имя в список. Если у тебя один клиент подключается раз в 10 минут, то если он не подключался в течении 21 минуты, то удаляешь тиакого клиента из списка (типа больше не работает - пропустил 2 сеанса связи).
|
|
#10
|
||||
|
||||
|
решил переделать что бы клиент был всегда подключен, ибо одно из условий задачи - получение инфы с клиента по желанию
![]() |
|
#11
|
|||
|
|||
|
ну да,как вчера и думали.терь T-dayne код падайдет?)
|
|
#12
|
||||
|
||||
|
отчасти да
![]() |
|
#13
|
|||
|
|||
|
хелп плиз сроки горят..немного прогу доделать надо..
Надо сделать(в серверной части) так чтобы в серверный лог ДОПИСЫВАЛОСЬ,а не перезаписывался серв.лог + эти 2 пункта. 3. В серверной части на форме нужно отображать какую-нибудь информацию. Например, информацию о доступных клиентах, чтобы администратор мог при желании наблюдать текущее состояние. 4. Нужно продумать возможность просматривания лог файлов на сервере по выбранной машине. прога здесь http://ifolder.ru/18416650 Последний раз редактировалось norfolk23, 04.07.2010 в 20:05. |