MIB_TCPROW_LH struttura (tcpmib.h)
La struttura MIB_TCPROW contiene informazioni che descibese una connessione TCP IPv4.
Sintassi
typedef struct _MIB_TCPROW_LH {
union {
DWORD dwState;
MIB_TCP_STATE State;
};
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
} MIB_TCPROW_LH, *PMIB_TCPROW_LH;
Members
dwState
Tipo: DWORD
Stato della connessione TCP. Questo membro può essere uno dei valori definiti nel file di intestazione Iprtrmib.h .
Nella Windows SDK rilasciata per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata. Questo membro può essere uno dei valori dell'enumerazione MIB_TCP_STATE definito nel file di intestazione Tcpmib.h , non nel file di intestazione Iprtrmib.h . Si noti che il file di intestazione Tcpmib.h viene automaticamente incluso in Iprtrmib.h, incluso automaticamente nel file di intestazione Iphlpapi.h . I file di intestazione Tcpmib.h e Iprtrmib.h non devono mai essere usati direttamente.
State
dwLocalAddr
Tipo: DWORD
Indirizzo IPv4 locale per la connessione TCP nel computer locale. Un valore pari a zero indica che il listener può accettare una connessione in qualsiasi interfaccia.
dwLocalPort
Tipo: DWORD
Numero di porta locale in ordine di byte di rete per la connessione TCP nel computer locale.
Le dimensioni massime di un numero di porta IP sono 16 bit, quindi è consigliabile usare solo i 16 bit inferiori. I 16 bit superiori possono contenere dati non inizializzati.
dwRemoteAddr
Tipo: DWORD
Indirizzo IPv4 per la connessione TCP nel computer remoto. Quando il membro dwState è MIB_TCP_STATE_LISTEN, questo valore non ha alcun significato.
dwRemotePort
Tipo: DWORD
Numero di porta remota in byte di rete per la connessione TCP nel computer remoto. Quando il membro dwState è MIB_TCP_STATE_LISTEN, questo membro non ha alcun significato.
Le dimensioni massime di un numero di porta IP sono 16 bit, quindi è consigliabile usare solo i 16 bit inferiori. I 16 bit superiori possono contenere dati non inizializzati.
Commenti
La funzione GetTcpTable recupera la tabella di connessione TCP IPv4 nel computer locale e restituisce queste informazioni in una struttura di MIB_TCPTABLE .
Una matrice di strutture MIB_TCPROW è contenuta nella struttura MIB_TCPTABLE . La struttura MIB_TCPROW viene usata anche dalla funzione SetTcpEntry .
Il membro dwState indica lo stato della voce TCP in un diagramma di stato TCP. Una connessione TCP passa attraverso una serie di stati durante la sua durata. Gli stati sono: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT e lo stato fittizio CHIUSO. Lo stato CLOSED è fittizio perché rappresenta lo stato quando non è presente alcun blocco di controllo di trasmissione e quindi nessuna connessione. Il protocollo TCP è descritto in RFC 793. Per altre informazioni, vedere http://www.ietf.org/rfc/rfc793.txt.
I membri dwLocalAddr e dwRemoteAddr vengono archiviati come DWORD nello stesso formato della struttura in_addr. Per usare i membri dwLocalAddr o dwRemoteAddr, è possibile che siano necessarie le funzioni ntohl o inet_ntoa in Windows Sockets o funzioni simili. In Windows Vista e versioni successive, le funzioni RtlIpv4AddressToString o RtlIpv4AddressToStringEx possono essere usate per convertire l'indirizzo IPv4 nei membri dwLocalAddr o dwRemoteAddr in una stringa senza caricare la DLL di Windows Sockets.
I membri dwLocalPort e dwRemotePort sono in ordine di byte di rete. Per usare i membri dwLocalPort o dwRemotePort , è possibile che siano necessarie funzioni ntohs o inet_ntoa in Windows Sockets o funzioni simili.
La struttura MIB_TCPROW è cambiata leggermente in Windows Vista e versioni successive. In Windows Vista e versioni successive il membro dwState viene sostituito da un'unione che contiene i membri seguenti.
Nella Windows SDK la versione della struttura da usare in Windows Vista e versioni successive viene definita come MIB_TCPROW_LH. Nella Windows SDK la versione di questa struttura da usare nei sistemi precedenti, inclusi Windows 2000 e versioni successive, viene definita come MIB_TCPROW_W2K. Quando si compila un'applicazione se la piattaforma di destinazione è Windows Vista e versioni successive (NTDDI_VERSION >= NTDDI_LONGHORN
, _WIN32_WINNT >= 0x0600
o ), WINVER >= 0x0600
la struttura di MIB_TCPROW_LH viene digitata nella struttura di MIB_TCPROW . Quando si compila un'applicazione se la piattaforma di destinazione non è Windows Vista e versioni successive, la strutturaMIB_TCPROW_W2K viene digitata nella struttura MIB_TCPROW.
Nella Windows SDK rilasciata per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata. Questa struttura è definita nel file di intestazione Tcpmib.h , non nel file di intestazione Iprtrmib.h . Si noti che il file di intestazione Tcpmib.h viene automaticamente incluso in Iprtrmib.h, incluso automaticamente nel file di intestazione Iphlpapi.h . I file di intestazione Tcpmib.h e Iprtrmib.h non devono mai essere usati direttamente.
Esempio
Nell'esempio seguente viene recuperata la tabella di connessione TCP e viene stampato lo stato di ogni connessione rappresentata come struttura MIB_TCPROW .
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int main()
{
// Declare and initialize variables
PMIB_TCPTABLE pTcpTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char szLocalAddr[128];
char szRemoteAddr[128];
struct in_addr IpAddr;
int i;
pTcpTable = (MIB_TCPTABLE *) MALLOC(sizeof (MIB_TCPTABLE));
if (pTcpTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
dwSize = sizeof (MIB_TCPTABLE);
// Make an initial call to GetTcpTable to
// get the necessary size into the dwSize variable
if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pTcpTable);
pTcpTable = (MIB_TCPTABLE *) MALLOC(dwSize);
if (pTcpTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
}
// Make a second call to GetTcpTable to get
// the actual data we require
if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == NO_ERROR) {
printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
printf("\n\tTCP[%d] State: %ld - ", i,
pTcpTable->table[i].dwState);
switch (pTcpTable->table[i].dwState) {
case MIB_TCP_STATE_CLOSED:
printf("CLOSED\n");
break;
case MIB_TCP_STATE_LISTEN:
printf("LISTEN\n");
break;
case MIB_TCP_STATE_SYN_SENT:
printf("SYN-SENT\n");
break;
case MIB_TCP_STATE_SYN_RCVD:
printf("SYN-RECEIVED\n");
break;
case MIB_TCP_STATE_ESTAB:
printf("ESTABLISHED\n");
break;
case MIB_TCP_STATE_FIN_WAIT1:
printf("FIN-WAIT-1\n");
break;
case MIB_TCP_STATE_FIN_WAIT2:
printf("FIN-WAIT-2 \n");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
printf("CLOSE-WAIT\n");
break;
case MIB_TCP_STATE_CLOSING:
printf("CLOSING\n");
break;
case MIB_TCP_STATE_LAST_ACK:
printf("LAST-ACK\n");
break;
case MIB_TCP_STATE_TIME_WAIT:
printf("TIME-WAIT\n");
break;
case MIB_TCP_STATE_DELETE_TCB:
printf("DELETE-TCB\n");
break;
default:
printf("UNKNOWN dwState value: %d\n", pTcpTable->table[i].dwState);
break;
}
IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);
printf("\tTCP[%d] Local Port: %d \n", i,
ntohs((u_short)pTcpTable->table[i].dwLocalPort));
IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));
printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr);
printf("\tTCP[%d] Remote Port: %d\n", i,
ntohs((u_short)pTcpTable->table[i].dwRemotePort));
}
} else {
printf("\tGetTcpTable failed with %d\n", dwRetVal);
FREE(pTcpTable);
return 1;
}
if (pTcpTable != NULL) {
FREE(pTcpTable);
pTcpTable = NULL;
}
return 0;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 2000 Professional [solo app desktop] |
Server minimo supportato | Windows 2000 Server [solo app desktop] |
Intestazione | tcpmib.h (include Iphlpapi.h) |
Vedi anche
MIB_TCP6ROW2