Перечисление сетевых соединений компьютера
Данный код перечислит все соединения компьютера по протоколу TCP, аналогично утилите netstat:
#pragma hdrstop
#include <stdio.h>
#include <winsock.h>
#include <iphlpapi.h>
//---------------------------------------------------------------------------
#define MAX_STRLEN 128
#pragma argsused
void PrintTcpTable(PMIB_TCPTABLE pTcpTable)
{
char strState[MAX_STRLEN];
struct in_addr inadLocal, inadRemote;
DWORD dwRemotePort = 0;
char szLocalIp[MAX_STRLEN];
char szRemIp[MAX_STRLEN];
if (pTcpTable != NULL)
{
printf("TCP TABLE\r\n");
printf("%20s %10s %20s %10s %s\r\n", "Loc Addr", "Loc Port", "Rem Addr",
"Rem Port", "State");
for (UINT i = 0; i < pTcpTable->dwNumEntries; ++i)
{
switch (pTcpTable->table[i].dwState)
{
case MIB_TCP_STATE_CLOSED:
strcpy(strState, "CLOSED");
break;
case MIB_TCP_STATE_TIME_WAIT:
strcpy(strState, "TIME_WAIT");
break;
case MIB_TCP_STATE_LAST_ACK:
strcpy(strState, "LAST_ACK");
break;
case MIB_TCP_STATE_CLOSING:
strcpy(strState, "CLOSING");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
strcpy(strState, "CLOSE_WAIT");
break;
case MIB_TCP_STATE_FIN_WAIT1:
strcpy(strState, "FIN_WAIT1");
break;
case MIB_TCP_STATE_ESTAB:
strcpy(strState, "ESTABLISHED");
break;
case MIB_TCP_STATE_SYN_RCVD:
strcpy(strState, "SYN_RCVD");
break;
case MIB_TCP_STATE_SYN_SENT:
strcpy(strState, "SYN_SENT");
break;
case MIB_TCP_STATE_LISTEN:
strcpy(strState, "LISTEN");
break;
case MIB_TCP_STATE_DELETE_TCB:
strcpy(strState, "DELETE");
break;
default:
printf("UNKNOWN\n\r");
break;
}
inadLocal.s_addr = pTcpTable->table[i].dwLocalAddr;
if (strcmp(strState, "LISTEN") != 0)
{
dwRemotePort = pTcpTable->table[i].dwRemotePort;
}
else
dwRemotePort = 0;
inadRemote.s_addr = pTcpTable->table[i].dwRemoteAddr;
strcpy(szLocalIp, inet_ntoa(inadLocal));
strcpy(szRemIp, inet_ntoa(inadRemote));
printf("%20s %10u %20s %10u %s\r\n",
szLocalIp, ntohs((unsigned short)(0x0000FFFF & pTcpTable->table[i].dwLocalPort)),
szRemIp, ntohs((unsigned short)(0x0000FFFF & dwRemotePort)),
strState);
}
}
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
WSADATA WSAData;
if (!WSAStartup(MAKEWORD(1,1),&WSAData))
{
printf("WSA started seccessfully!\r\n");
PMIB_TCPTABLE pTcpTable = NULL;
DWORD dwActualSize = 0;
DWORD status = NO_ERROR;
status = GetTcpTable(pTcpTable, &dwActualSize, TRUE);
if (status == NOERROR) printf("Success!\r\n");
else if (status == ERROR_INSUFFICIENT_BUFFER)
{
printf("Error memory! %u %u\r\n",dwActualSize, sizeof(*pTcpTable));
pTcpTable = (PMIB_TCPTABLE) malloc(dwActualSize);
status = GetTcpTable(pTcpTable, &dwActualSize, TRUE);
if (status == NOERROR) printf("taki Success!\r\n");
PrintTcpTable(pTcpTable);
};
if (pTcpTable)
free(pTcpTable);
getchar();
WSACleanup();
};
return 0;
}