⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netstat.c

📁 Linux下网络相关工具源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
}#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 + -