Форум — Ответы     (  К темам )
 ?  nike: Кто подключен ко мне по сети сейчас. (03-03-2003 16:41:04)
Какие есть идеи просмотра активных сетевых подключений(типа netstat), другими словами, я хочу знать, кто подключен ко мне в данный момент времени(его IP или name).
 Devnvd (10-03-2003 18:38:32)
Можно воспользоваться услугами iphlpapi.dll:
функции GetTCPTable и GetTcpTable.
Для примера подключения по TCP протоколу можно увидеть так, аналогично раскручивается и протокол UDP:

#include
#pragma hdrstop
#include
#include
#include
#include

#pragma link "iphlpapi.lib"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

#define HOSTNAMELEN 256
#define PORTNAMELEN 256
#define ADDRESSLEN HOSTNAMELEN+PORTNAMELEN

PCHAR GetIpHostName(UINT ipaddr,PCHAR name)
{
UINT nipaddr;
nipaddr = htonl( ipaddr );
sprintf( name, "%d.%d.%d.%d",
(nipaddr>> 24) & 0xFF,
(nipaddr>> 16) & 0xFF,
(nipaddr>> 8) & 0xFF,
(nipaddr) & 0xFF);
return name;
}
PCHAR GetPortName(UINT port, PCHAR name)
{
sprintf( name, "%d", htons( (WORD) port));
return name;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
// Possible TCP endpoint states
//
static char TcpState[][32] = {
"???",
"CLOSED",
"LISTENING",
"SYN_SENT",
"SYN_RCVD",
"ESTABLISHED",
"FIN_WAIT1",
"FIN_WAIT2",
"CLOSE_WAIT",
"CLOSING",
"LAST_ACK",
"TIME_WAIT",
"DELETE_TCB"
};
DWORD i,error, dwSize;
WSADATA wsaData;
PMIB_TCPTABLE tcpTable;
CHAR localname[HOSTNAMELEN], remotename[HOSTNAMELEN];
CHAR remoteport[PORTNAMELEN], localport[PORTNAMELEN];
CHAR localaddr[ADDRESSLEN], remoteaddr[ADDRESSLEN];

AnsiString S;

Memo1->Clear();

//Получим размер таблицы
dwSize = 0;
error = GetTcpTable( NULL, &dwSize, TRUE );
if( error != ERROR_INSUFFICIENT_BUFFER )return ;

//Выделим память под таблицу
tcpTable = (PMIB_TCPTABLE) new char[ dwSize ];
//Получим таблицу
error = GetTcpTable( tcpTable, &dwSize, TRUE );
if( error ){delete tcpTable; return ; }
//Посмотрим на содержимое таблицы
for( i = 0; i < tcpTable->dwNumEntries; i++ )
{
sprintf( localaddr, "%s:%s",
GetIpHostName(tcpTable->table[i].dwLocalAddr, localname),
GetPortName(tcpTable->table[i].dwLocalPort, localport));
sprintf( remoteaddr, "%s:%s",
GetIpHostName(tcpTable->table[i].dwRemoteAddr, remotename),
tcpTable->table[i].dwRemoteAddr ?
GetPortName(tcpTable->table[i].dwRemotePort, remoteport):
"0" );
S.printf("%4stState: %srn", "[TCP]",
TcpState[ tcpTable->table[i].dwState ] );
S.cat_printf(" Local: %srn Remote: %srn",
localaddr, remoteaddr );
Memo1->Lines->Add(S);
}
delete tcpTable;
}
 Devnvd (10-03-2003 18:41:01)
Повторю код:
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <winsock.h>
#include <iprtrmib.h>
#include <iphlpapi.h>

#pragma link "iphlpapi.lib"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

#define HOSTNAMELEN 256
#define PORTNAMELEN 256
#define ADDRESSLEN HOSTNAMELEN+PORTNAMELEN

PCHAR GetIpHostName(UINT ipaddr,PCHAR name)
{
UINT nipaddr;
nipaddr = htonl( ipaddr );
sprintf( name, "%d.%d.%d.%d",
(nipaddr >> 24) & 0xFF,
(nipaddr >> 16) & 0xFF,
(nipaddr >> 8) & 0xFF,
(nipaddr) & 0xFF);
return name;
}
PCHAR GetPortName(UINT port, PCHAR name)
{
sprintf( name, "%d", htons( (WORD) port));
return name;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
// Possible TCP endpoint states
//
static char TcpState[][32] = {
"???",
"CLOSED",
"LISTENING",
"SYN_SENT",
"SYN_RCVD",
"ESTABLISHED",
"FIN_WAIT1",
"FIN_WAIT2",
"CLOSE_WAIT",
"CLOSING",
"LAST_ACK",
"TIME_WAIT",
"DELETE_TCB"
};
DWORD i,error, dwSize;
WSADATA wsaData;
PMIB_TCPTABLE tcpTable;
CHAR localname[HOSTNAMELEN], remotename[HOSTNAMELEN];
CHAR remoteport[PORTNAMELEN], localport[PORTNAMELEN];
CHAR localaddr[ADDRESSLEN], remoteaddr[ADDRESSLEN];

AnsiString S;

Memo1->Clear();

//Получим размер таблицы
dwSize = 0;
error = GetTcpTable( NULL, &dwSize, TRUE );
if( error != ERROR_INSUFFICIENT_BUFFER )return ;

//Выделим память под таблицу
tcpTable = (PMIB_TCPTABLE) new char[ dwSize ];
//Получим таблицу
error = GetTcpTable( tcpTable, &dwSize, TRUE );
if( error ){delete tcpTable; return ; }
//Посмотрим на содержимое таблицы
for( i = 0; i < tcpTable->dwNumEntries; i++ )
{
sprintf( localaddr, "%s:%s",
GetIpHostName(tcpTable->table[i].dwLocalAddr, localname),
GetPortName(tcpTable->table[i].dwLocalPort, localport));
sprintf( remoteaddr, "%s:%s",
GetIpHostName(tcpTable->table[i].dwRemoteAddr, remotename),
tcpTable->table[i].dwRemoteAddr ?
GetPortName(tcpTable->table[i].dwRemotePort, remoteport):
"0" );
S.printf("%4s\tState: %s\r\n", "[TCP]",
TcpState[ tcpTable->table[i].dwState ] );
S.cat_printf(" Local: %s\r\n Remote: %s\r\n",
localaddr, remoteaddr );
Memo1->Lines->Add(S);
}
delete tcpTable;
}