[1/2] netstat: Implement the TCP stats output (try 2)
André Hentschel
nerv at dawncrow.de
Mon Jan 21 14:12:36 CST 2013
---
programs/netstat/netstat.c | 33 +++++++++++++++++++++++++++++++++
programs/netstat/netstat.h | 9 +++++++++
programs/netstat/netstat.rc | 9 +++++++++
3 files changed, 51 insertions(+)
diff --git a/programs/netstat/netstat.c b/programs/netstat/netstat.c
index 0194e90..55aa466 100644
--- a/programs/netstat/netstat.c
+++ b/programs/netstat/netstat.c
@@ -46,6 +46,7 @@ static const WCHAR fmtethoutu[] = {'%', '-', '2', '0', 's', ' ', '%', '1', '4',
static const WCHAR fmtethheader[] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', '%', '-', '1', '9', 's', ' ', '%', 's', '\n', '\n', 0};
+static const WCHAR fmttcpstat[] = {' ', ' ', '%', '-', '3', '5', 's', ' ', '=', ' ', '%', 'l', 'u', '\n', 0};
static const WCHAR tcpstatesW[][16] = {
{'?', '?', '?', 0},
@@ -270,6 +271,29 @@ static void NETSTAT_tcp_table(void)
HeapFree(GetProcessHeap(), 0, table);
}
+static void NETSTAT_tcp_stats(void)
+{
+ PMIB_TCPSTATS stats;
+
+ stats = (PMIB_TCPSTATS)HeapAlloc(GetProcessHeap(), 0, sizeof(MIB_TCPSTATS));
+
+ if (GetTcpStatistics(stats) == NO_ERROR)
+ {
+ NETSTAT_wprintf(fmtnn, NETSTAT_load_message(IDS_TCP_STAT));
+ NETSTAT_wprintf(fmtn);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_ACTIVE_OPEN), stats->dwActiveOpens);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_PASSIV_OPEN), stats->dwPassiveOpens);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_FAILED_CONN), stats->dwAttemptFails);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_RESET_CONN), stats->dwEstabResets);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_CURR_CONN), stats->dwCurrEstab);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_SEGM_RECV), stats->dwInSegs);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_SEGM_SENT), stats->dwOutSegs);
+ NETSTAT_wprintf(fmttcpstat, NETSTAT_load_message(IDS_TCP_SEGM_RETRAN), stats->dwRetransSegs);
+ }
+
+ HeapFree(GetProcessHeap(), 0, stats);
+}
+
static void NETSTAT_udp_table(void)
{
PMIB_UDPTABLE table;
@@ -314,6 +338,7 @@ static NETSTATPROTOCOLS NETSTAT_get_protocol(WCHAR name[])
int wmain(int argc, WCHAR *argv[])
{
WSADATA wsa_data;
+ BOOL output_stats = FALSE;
if (WSAStartup(MAKEWORD(2, 2), &wsa_data))
{
@@ -341,12 +366,17 @@ int wmain(int argc, WCHAR *argv[])
case 'e':
NETSTAT_eth_stats();
return 0;
+ case 's':
+ output_stats = TRUE;
+ break;
case 'p':
argv++; argc--;
if (argc == 1) return 1;
switch (NETSTAT_get_protocol(argv[1]))
{
case PROT_TCP:
+ if (output_stats)
+ NETSTAT_tcp_stats();
NETSTAT_conn_header();
NETSTAT_tcp_table();
break;
@@ -365,5 +395,8 @@ int wmain(int argc, WCHAR *argv[])
argv++; argc--;
}
+ if (output_stats)
+ NETSTAT_tcp_stats();
+
return 0;
}
diff --git a/programs/netstat/netstat.h b/programs/netstat/netstat.h
index 3176939..a1458a1 100644
--- a/programs/netstat/netstat.h
+++ b/programs/netstat/netstat.h
@@ -44,3 +44,12 @@ typedef enum _NETSTATPROTOCOLS {
#define IDS_ETH_DISCARDS 12
#define IDS_ETH_ERRORS 13
#define IDS_ETH_UNKNOWN 14
+#define IDS_TCP_STAT 15
+#define IDS_TCP_ACTIVE_OPEN 16
+#define IDS_TCP_PASSIV_OPEN 17
+#define IDS_TCP_FAILED_CONN 18
+#define IDS_TCP_RESET_CONN 19
+#define IDS_TCP_CURR_CONN 20
+#define IDS_TCP_SEGM_RECV 21
+#define IDS_TCP_SEGM_SENT 22
+#define IDS_TCP_SEGM_RETRAN 23
diff --git a/programs/netstat/netstat.rc b/programs/netstat/netstat.rc
index d27fe1b..59e4575 100644
--- a/programs/netstat/netstat.rc
+++ b/programs/netstat/netstat.rc
@@ -38,4 +38,13 @@ STRINGTABLE
IDS_ETH_DISCARDS, "Discards"
IDS_ETH_ERRORS, "Errors"
IDS_ETH_UNKNOWN, "Unknown protocols"
+ IDS_TCP_STAT, "TCP Statistics for IPv4"
+ IDS_TCP_ACTIVE_OPEN, "Active Opens"
+ IDS_TCP_PASSIV_OPEN, "Passive Opens"
+ IDS_TCP_FAILED_CONN, "Failed Connection Attempts"
+ IDS_TCP_RESET_CONN, "Reset Connections"
+ IDS_TCP_CURR_CONN, "Current Connections"
+ IDS_TCP_SEGM_RECV, "Segments Received"
+ IDS_TCP_SEGM_SENT, "Segments Sent"
+ IDS_TCP_SEGM_RETRAN, "Segments Retransmitted"
}
--
1.8.0
--
Best Regards, André Hentschel
More information about the wine-patches
mailing list