Форум — Ответы ( К темам )
? | 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; } |