[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