📄 netstat.c
字号:
}#endif/* These enums are used by IPX too. :-( */enum { TCP_ESTABLISHED = 1, TCP_SYN_SENT, TCP_SYN_RECV, TCP_FIN_WAIT1, TCP_FIN_WAIT2, TCP_TIME_WAIT, TCP_CLOSE, TCP_CLOSE_WAIT, TCP_LAST_ACK, TCP_LISTEN, TCP_CLOSING /* now a valid state */};#if HAVE_AFINET || HAVE_AFINET6static const char *tcp_state[] ={ "", N_("ESTABLISHED"), N_("SYN_SENT"), N_("SYN_RECV"), N_("FIN_WAIT1"), N_("FIN_WAIT2"), N_("TIME_WAIT"), N_("CLOSE"), N_("CLOSE_WAIT"), N_("LAST_ACK"), N_("LISTEN"), N_("CLOSING")};static void finish_this_one(int uid, unsigned long inode, const char *timers){ struct passwd *pw; if (flag_exp > 1) { if (!flag_not && ((pw = getpwuid(uid)) != NULL)) printf("%-10s ", pw->pw_name); else printf("%-10d ", uid); printf("%-10ld ",inode); } if (flag_prg) printf("%-" PROGNAME_WIDTHs "s",prg_cache_get(inode)); if (flag_opt) printf("%s", timers); putchar('\n');}static void igmp_do_one(int lnr, const char *line){ char mcast_addr[128];#if HAVE_AFINET6 struct sockaddr_in6 mcastaddr; char addr6p[8][5]; char addr6[128]; extern struct aftype inet6_aftype;#else struct sockaddr_in mcastaddr;#endif struct aftype *ap; static int idx_flag = 0; static int igmp6_flag = 0; static char device[16]; int num, idx, refcnt; if (lnr == 0) { /* IPV6 ONLY */ /* igmp6 file does not have any comments on first line */ if ( strstr( line, "Device" ) == NULL ) { igmp6_flag = 1; } else { /* IPV4 ONLY */ /* 2.1.x kernels and up have Idx field */ /* 2.0.x and below do not have Idx field */ if ( strncmp( line, "Idx", strlen("Idx") ) == 0 ) idx_flag = 1; else idx_flag = 0; return; } } if (igmp6_flag) { /* IPV6 */#if HAVE_AFINET6 num = sscanf( line, "%d %15s %64[0-9A-Fa-f] %d", &idx, device, mcast_addr, &refcnt ); if (num == 4) { /* Demangle what the kernel gives us */ sscanf(mcast_addr, "%4s%4s%4s%4s%4s%4s%4s%4s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); inet6_aftype.input(1, addr6, (struct sockaddr *) &mcastaddr); mcastaddr.sin6_family = AF_INET6; } else { fprintf(stderr, _("warning, got bogus igmp6 line %d.\n"), lnr); return; } if ((ap = get_afntype(((struct sockaddr *) &mcastaddr)->sa_family)) == NULL) { fprintf(stderr, _("netstat: unsupported address family %d !\n"), ((struct sockaddr *) &mcastaddr)->sa_family); return; } strcpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, flag_not)); printf("%-15s %-6d %s\n", device, refcnt, mcast_addr);#endif } else { /* IPV4 */#if HAVE_AFINET if (line[0] != '\t') { if (idx_flag) { if ((num = sscanf( line, "%d\t%10c", &idx, device)) < 2) { fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); return; } } else { if ( (num = sscanf( line, "%10c", device )) < 1 ) { fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); return; } } device[10] = '\0'; return; } else if ( line[0] == '\t' ) { if ( (num = sscanf(line, "\t%8[0-9A-Fa-f] %d", mcast_addr, &refcnt)) < 2 ) { fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); return; } sscanf( mcast_addr, "%X", &((struct sockaddr_in *) &mcastaddr)->sin_addr.s_addr ); ((struct sockaddr *) &mcastaddr)->sa_family = AF_INET; } else { fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); return; } if ((ap = get_afntype(((struct sockaddr *) &mcastaddr)->sa_family)) == NULL) { fprintf(stderr, _("netstat: unsupported address family %d !\n"), ((struct sockaddr *) &mcastaddr)->sa_family); return; } strcpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, flag_not) ); printf("%-15s %-6d %s\n", device, refcnt, mcast_addr );#endif } /* IPV4 */}static int igmp_info(void){ INFO_GUTS6(_PATH_PROCNET_IGMP, _PATH_PROCNET_IGMP6, "AF INET (igmp)", igmp_do_one);}static void tcp_do_one(int lnr, const char *line){ unsigned long rxq, txq, time_len, retr, inode; int num, local_port, rem_port, d, state, uid, timer_run, timeout; char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512]; struct aftype *ap;#if HAVE_AFINET6 struct sockaddr_in6 localaddr, remaddr; char addr6p[16][3], addr6[128]; extern struct aftype inet6_aftype;#else struct sockaddr_in localaddr, remaddr;#endif if (lnr == 0) return; num = sscanf(line, "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n", &d, local_addr, &local_port, rem_addr, &rem_port, &state, &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); if (strlen(local_addr) > 8) {#if HAVE_AFINET6 /* Demangle what the kernel gives us */ sscanf(local_addr, "%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7], addr6p[8], addr6p[9], addr6p[10], addr6p[11], addr6p[12], addr6p[13], addr6p[14], addr6p[15]); snprintf(addr6, sizeof(addr6), "%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s", addr6p[3], addr6p[2], addr6p[1], addr6p[0], addr6p[7], addr6p[6], addr6p[5], addr6p[4], addr6p[11], addr6p[10], addr6p[9], addr6p[8], addr6p[15], addr6p[14], addr6p[13], addr6p[12]); inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr); sscanf(rem_addr, "%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7], addr6p[8], addr6p[9], addr6p[10], addr6p[11], addr6p[12], addr6p[13], addr6p[14], addr6p[15]); snprintf(addr6, sizeof(addr6), "%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s", addr6p[3], addr6p[2], addr6p[1], addr6p[0], addr6p[7], addr6p[6], addr6p[5], addr6p[4], addr6p[11], addr6p[10], addr6p[9], addr6p[8], addr6p[15], addr6p[14], addr6p[13], addr6p[12]); inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr); localaddr.sin6_family = AF_INET6; remaddr.sin6_family = AF_INET6;#endif } else { sscanf(local_addr, "%X", &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr); sscanf(rem_addr, "%X", &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr); ((struct sockaddr *) &localaddr)->sa_family = AF_INET; ((struct sockaddr *) &remaddr)->sa_family = AF_INET; } if (num < 11) { fprintf(stderr, _("warning, got bogus tcp line.\n")); return; } if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) { fprintf(stderr, _("netstat: unsupported address family %d !\n"), ((struct sockaddr *) &localaddr)->sa_family); return; } if (state == TCP_LISTEN) { time_len = 0; retr = 0L; rxq = 0L; txq = 0L; } strcpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, flag_not)); strcpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not)); if (flag_all || (flag_lst && !rem_port) || (!flag_lst && rem_port)) { snprintf(buffer, sizeof(buffer), "%s", get_sname(htons(local_port), "tcp", flag_not)); if ((strlen(local_addr) + strlen(buffer)) > 22) local_addr[22 - strlen(buffer)] = '\0'; strcat(local_addr, ":"); strcat(local_addr, buffer); snprintf(buffer, sizeof(buffer), "%s", get_sname(htons(rem_port), "tcp", flag_not)); if ((strlen(rem_addr) + strlen(buffer)) > 22) rem_addr[22 - strlen(buffer)] = '\0'; strcat(rem_addr, ":"); strcat(rem_addr, buffer); timers[0] = '\0'; if (flag_opt) switch (timer_run) { case 0: snprintf(timers, sizeof(timers), _("off (0.00/%ld/%d)"), retr, timeout); break; case 1: case 2: snprintf(timers, sizeof(timers), _("on%d (%2.2f/%ld/%d)"), timer_run,(double) time_len / HZ, retr, timeout); break; default: snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / HZ, retr, timeout); break; } printf("tcp %6ld %6ld %-23s %-23s %-12s", rxq, txq, local_addr, rem_addr, _(tcp_state[state])); finish_this_one(uid,inode,timers); }}static int tcp_info(void){ INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)", tcp_do_one);}static void udp_do_one(int lnr, const char *line){ char buffer[8192], local_addr[64], rem_addr[64]; char *udp_state, timers[64], more[512]; int num, local_port, rem_port, d, state, timer_run, uid, timeout;#if HAVE_AFINET6 struct sockaddr_in6 localaddr, remaddr; char addr6p[8][5]; char addr6[128]; extern struct aftype inet6_aftype;#else struct sockaddr_in localaddr, remaddr;#endif struct aftype *ap; unsigned long rxq, txq, time_len, retr, inode; if (lnr == 0) return; more[0] = '\0'; num = sscanf(line, "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n", &d, local_addr, &local_port, rem_addr, &rem_port, &state, &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); if (strlen(local_addr) > 8) {#if HAVE_AFINET6 sscanf(local_addr, "%4s%4s%4s%4s%4s%4s%4s%4s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr); sscanf(rem_addr, "%4s%4s%4s%4s%4s%4s%4s%4s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr); localaddr.sin6_family = AF_INET6; remaddr.sin6_family = AF_INET6;#endif } else { sscanf(local_addr, "%X", &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr); sscanf(rem_addr, "%X", &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr); ((struct sockaddr *) &localaddr)->sa_family = AF_INET; ((struct sockaddr *) &remaddr)->sa_family = AF_INET; } retr = 0L; if (!flag_opt) more[0] = '\0'; if (num < 10) { fprintf(stderr, _("warning, got bogus udp line.\n")); return; } if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) { fprintf(stderr, _("netstat: unsupported address family %d !\n"), ((struct sockaddr *) &localaddr)->sa_family); return; } switch (state) { case TCP_ESTABLISHED: udp_state = _("ESTABLISHED"); break; case TCP_CLOSE: udp_state = ""; break; default: udp_state = _("UNKNOWN"); break; }#if HAVE_AFINET6#define notnull(A) (((A.sin6_family == AF_INET6) && \ ((A.sin6_addr.s6_addr32[0]) || \ (A.sin6_addr.s6_addr32[1]) || \ (A.sin6_addr.s6_addr32[2]) || \ (A.sin6_addr.s6_addr32[3]))) || \ ((A.sin6_family == AF_INET) && \ ((struct sockaddr_in *) &A)->sin_addr.s_addr))#else#define notnull(A) (A.sin_addr.s_addr)#endif if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst)) { strcpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, flag_not)); snprintf(buffer, sizeof(buffer), "%s", get_sname(htons(local_port), "udp", flag_not)); if ((strlen(local_addr) + strlen(buffer)) > 22) local_addr[22 - strlen(buffer)] = '\0'; strcat(local_addr, ":"); strcat(local_addr, buffer); snprintf(buffer, sizeof(buffer), "%s", get_sname(htons(rem_port), "udp", flag_not)); strcpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not)); if ((strlen(rem_addr) + strlen(buffer)) > 22) rem_addr[22 - strlen(buffer)] = '\0'; strcat(rem_addr, ":"); strcat(rem_addr, buffer); timers[0] = '\0'; if (flag_opt) switch (timer_run) { case 0: snprintf(timers, sizeof(timers), _("off (0.00/%ld/%d)"), retr, timeout); break; case 1: case 2: snprintf(timers, sizeof(timers), _("on%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / 100, retr, timeout); break; default: snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / 100, retr, timeout); break; } printf("udp %6ld %6ld %-23s %-23s %-12s", rxq, txq, local_addr, rem_addr, udp_state); finish_this_one(uid,inode,timers); }}static int udp_info(void){ INFO_GUTS6(_PATH_PROCNET_UDP, _PATH_PROCNET_UDP6, "AF INET (udp)", udp_do_one);}static void raw_do_one(int lnr, const char *line){ char buffer[8192], local_addr[64], rem_addr[64]; char timers[64], more[512]; int num, local_port, rem_port, d, state, timer_run, uid, timeout;#if HAVE_AFINET6 struct sockaddr_in6 localaddr, remaddr; char addr6p[8][5]; char addr6[128]; extern struct aftype inet6_aftype;#else struct sockaddr_in localaddr, remaddr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -