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

Вниз

Перечисление IP   Найти похожие ветки 

 
Dstr ©   (2006-05-10 23:09) [0]

Доброй ночи,Помогите пожалуйста,я пишу локальный чат,и мне надо перечислить все сетевые подключения и IP к ним.


 
Dstr ©   (2006-05-10 23:32) [1]

Мда,извините,но я сам уже ответил на свой вопрос:

unit TcpTable;
interface
type
 PDWord = ^Longword;
 PMIB_TCPROW = ^TMIB_TCPROW;
 TMIB_TCPROW = record
   dwState: LongWord;
   dwLocalAddr: LongWord;
   dwLocalPort: LongWord;
   dwRemoteAddr: LongWord;
   dwRemotePort: LongWord;
 end;
 PMIB_TCPTABLE = ^TMIB_TCPTABLE;
 TMIB_TCPTABLE = record
   dwNumEntries: LongWord;
   table: array[0..0] of TMIB_TCPROW;
 end;

function GetTcpTable(var TcpTable: PMIB_TCPTABLE;
 var Size: PDWord; bOrder: Boolean): LongWord; stdcall

implementation

function GetTcpTable; external "Iphlpapi.dll" name "GetTcpTable";

end.


Но сегодня,я его не испробовал,так что пишите и свои предложения,а я пошел делать уроки,а то мне задано дохера...


 
Dstr ©   (2006-05-10 23:41) [2]

Хехе,2 ответ на мой же вопрос:

unit USock;

interface

uses
 Windows, Winsock;

{

Если Вы поместите строку результатов в wide TMEMO
(в его свойство memo.lines.text)
то никаких результатов не увидите.

Тестировалось на Win98/ME/2K, 95 OSR 2 и NT service
pack #3 , потому что используется WinSock 2 (WS2_32.DLL)

}

function EnumInterfaces(var sInt: string): Boolean;

{ функция WSAIOCtl импортируется из Winsock 2.0 - Winsock 2 доступен }
{ только в Win98/ME/2K и 95 OSR2, NT srv pack #3 }

function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
 DWORD;
 lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
 lpdwOutBytesReturned: LPDWORD;
 lpOverLapped: POINTER;
 lpOverLappedRoutine: POINTER): Integer; stdcall; external "WS2_32.DLL";

{ Константы взятые из заголовка C файлов }

const
 SIO_GET_INTERFACE_LIST = $4004747F;
 IFF_UP = $00000001;
 IFF_BROADCAST = $00000002;
 IFF_LOOPBACK = $00000004;
 IFF_POINTTOPOINT = $00000008;
 IFF_MULTICAST = $00000010;

type sockaddr_gen = packed record
 AddressIn: sockaddr_in;
 filler: packed array [0..7] of char;
end;

type INTERFACE_INFO = packed record
 iiFlags: u_long; // Флаги интерфейса
 iiAddress: sockaddr_gen; // Адрес интерфейса
 iiBroadcastAddress: sockaddr_gen; // Broadcast адрес
 iiNetmask: sockaddr_gen; // Маска подсети
end;

implementation

{-------------------------------------------------------------------

1. Открываем WINSOCK
2. Создаём сокет
3. Вызываем WSAIOCtl для доступа к сетевым интерфейсам
4. Для каждого интерфейса, получаем IP, MASK, BROADCAST, статус
5. Разделяем строку символом CRLF
6. Конец :)

--------------------------------------------------------------------}

function EnumInterfaces(var sInt: string): Boolean;
var
 s: TSocket;
 wsaD: WSADATA;
 NumInterfaces: Integer;
 BytesReturned, SetFlags: u_long;
 pAddrInet: SOCKADDR_IN;
 pAddrString: PCHAR;
 PtrA: pointer;
 Buffer: array[0..20] of INTERFACE_INFO;
 i: Integer;
begin
 result := true; // Инициализируем переменную
 sInt := "";

 WSAStartup($0101, wsaD); // Запускаем WinSock
 // Здесь можно дабавить различные обработчики ошибки :)

 s := Socket(AF_INET, SOCK_STREAM, 0); // Открываем сокет
 if (s = INVALID_SOCKET) then
   exit;

 try // Вызываем WSAIoCtl
   PtrA := @bytesReturned;
   if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer,
   1024, PtrA, nil, nil) <> SOCKET_ERROR) then
   begin // Если OK, то определяем количество существующих интерфейсов

     NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);

     for i := 0 to NumInterfaces - 1 do // Для каждого интерфейса
     begin
       pAddrInet := Buffer[i].iiAddress.addressIn; // IP адрес
       pAddrString := inet_ntoa(pAddrInet.sin_addr);
       sInt := sInt + " IP=" + pAddrString + ",";
       pAddrInet := Buffer[i].iiNetMask.addressIn; // Маска подсети
       pAddrString := inet_ntoa(pAddrInet.sin_addr);
       sInt := sInt + " Mask=" + pAddrString + ",";
       pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast адрес
       pAddrString := inet_ntoa(pAddrInet.sin_addr);
       sInt := sInt + " Broadcast=" + pAddrString + ",";

       SetFlags := Buffer[i].iiFlags;
       if (SetFlags and IFF_UP) = IFF_UP then
         sInt := sInt + " Interface UP," // Статус интерфейса up/down
       else
         sInt := sInt + " Interface DOWN,";

       if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts
         sInt := sInt + " Broadcasts supported," // поддерживает или
       else // не поддерживается
         sInt := sInt + " Broadcasts NOT supported,";

       if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then // Циклический или
         sInt := sInt + " Loopback interface"
       else
         sInt := sInt + " Network interface"; // нормальный

       sInt := sInt + #13#10; // CRLF между каждым интерфейсом
     end;
 end;
 except
 end;
 //
 // Закрываем сокеты
 //
 CloseSocket(s);
 WSACleanUp;
 result := false;
end;

end.


 
Windows ©   (2006-05-11 13:42) [3]

ОФТОП:
вот человек, сам вопросы задает и сам отвечает, только не понятно, что от нас хочет))))


 
Dstr ©   (2006-05-11 13:44) [4]

Мужик не парься,я ето просто почти неделю выкладывал и никто не отвечал,и в етот выложил поздно,и ответ нашелся сам,а написал я для того чтобы вопрос не повторялся...



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

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

Наверх




Память: 0.48 MB
Время: 0.093 c
15-1157637192
oldman
2006-09-07 17:53
2006.10.01
Завтра по СТС "ночной дозор"...


2-1158119650
ZSergey
2006-09-13 07:54
2006.10.01
Ошибка конвертации, не могу понять ...


15-1157694584
Ega23
2006-09-08 09:49
2006.10.01
С Днём рождения! 8 сентября


8-1142090760
Endor
2006-03-11 18:26
2006.10.01
OGG, WMA


8-1141976188
Unitay
2006-03-10 10:36
2006.10.01
Как узнать время bitrate...