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

📄 netstat.c

📁 Linux下网络相关工具源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
#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;    }#if HAVE_AFINET6    if ((ap = get_afntype(localaddr.sin6_family)) == NULL) {	fprintf(stderr, _("netstat: unsupported address family %d !\n"), localaddr.sin6_family);	return;    }#else    if ((ap = get_afntype(localaddr.sin_family)) == NULL) {	fprintf(stderr, _("netstat: unsupported address family %d !\n"), localaddr.sin_family);	return;    }#endif    if (!flag_opt)	more[0] = '\0';    if (num < 10) {	fprintf(stderr, _("warning, got bogus raw line.\n"));	return;    }    if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst))    {	snprintf(buffer, sizeof(buffer), "%s", get_sname(htons(local_port), "raw", flag_not));        strcpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, 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), "raw", 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("raw   %6ld %6ld %-23s %-23s %-12d",	       rxq, txq, local_addr, rem_addr, state);	finish_this_one(uid,inode,timers);    }}static int raw_info(void){    INFO_GUTS6(_PATH_PROCNET_RAW, _PATH_PROCNET_RAW6, "AF INET (raw)",	       raw_do_one);}#endif#if HAVE_AFUNIX#define HAS_INODE 1static void unix_do_one(int nr, const char *line){    static int has = 0;    char path[MAXPATHLEN], ss_flags[32];    char *ss_proto, *ss_state, *ss_type;    int num, state, type, inode;    void *d;    unsigned long refcnt, proto, flags;    if (nr == 0) {	if (strstr(line, "Inode"))	    has |= HAS_INODE;	return;    }    path[0] = '\0';    num = sscanf(line, "%p: %lX %lX %lX %X %X %d %s",		 &d, &refcnt, &proto, &flags, &type, &state, &inode, path);    if (num < 6) {	fprintf(stderr, _("warning, got bogus unix line.\n"));	return;    }    if (!(has & HAS_INODE))	snprintf(path,sizeof(path),"%d",inode);    if (!flag_all) {    	if ((state == SS_UNCONNECTED) && (flags & SO_ACCEPTCON)) {    		if (!flag_lst)    			return;    	} else {    		if (flag_lst)    			return;    	}    }    switch (proto) {    case 0:	ss_proto = "unix";	break;    default:	ss_proto = "??";    }    switch (type) {    case SOCK_STREAM:	ss_type = _("STREAM");	break;    case SOCK_DGRAM:	ss_type = _("DGRAM");	break;    case SOCK_RAW:	ss_type = _("RAW");	break;    case SOCK_RDM:	ss_type = _("RDM");	break;    case SOCK_SEQPACKET:	ss_type = _("SEQPACKET");	break;    default:	ss_type = _("UNKNOWN");    }    switch (state) {    case SS_FREE:	ss_state = _("FREE");	break;    case SS_UNCONNECTED:	/*	 * Unconnected sockets may be listening	 * for something.	 */	if (flags & SO_ACCEPTCON) {	    ss_state = _("LISTENING");	} else {	    ss_state = "";	}	break;    case SS_CONNECTING:	ss_state = _("CONNECTING");	break;    case SS_CONNECTED:	ss_state = _("CONNECTED");	break;    case SS_DISCONNECTING:	ss_state = _("DISCONNECTING");	break;    default:	ss_state = _("UNKNOWN");    }    strcpy(ss_flags, "[ ");    if (flags & SO_ACCEPTCON)	strcat(ss_flags, "ACC ");    if (flags & SO_WAITDATA)	strcat(ss_flags, "W ");    if (flags & SO_NOSPACE)	strcat(ss_flags, "N ");    strcat(ss_flags, "]");    printf("%-5s %-6ld %-11s %-10s %-13s ",	   ss_proto, refcnt, ss_flags, ss_type, ss_state);    if (has & HAS_INODE)	printf("%-6d ",inode);    else	printf("-      ");    if (flag_prg)	printf("%-" PROGNAME_WIDTHs "s",(has & HAS_INODE?prg_cache_get(inode):"-"));    puts(path);}static int unix_info(void){    printf(_("Active UNIX domain sockets "));    if (flag_all)	printf(_("(servers and established)"));    else {      if (flag_lst)	printf(_("(only servers)"));      else	printf(_("(w/o servers)"));    }    printf(_("\nProto RefCnt Flags       Type       State         I-Node"));    print_progname_banner();    printf(_(" Path\n"));	/* xxx */    {	INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one);    }}#endif#if HAVE_AFAX25static int ax25_info(void){    FILE *f;    char buffer[256], buf[16];    char *src, *dst, *dev, *p;    int st, vs, vr, sendq, recvq, ret;    int new = -1;		/* flag for new (2.1.x) kernels */    static char *ax25_state[5] =    {	N_("LISTENING"),	N_("SABM SENT"),	N_("DISC SENT"),	N_("ESTABLISHED"),	N_("RECOVERY")    };    if (!(f = fopen(_PATH_PROCNET_AX25, "r"))) {	if (errno != ENOENT) {	    perror(_PATH_PROCNET_AX25);	    return (-1);	}	if (flag_arg || flag_ver)	    ESYSNOT("netstat", "AF AX25");	if (flag_arg)	    return (1);	else	    return (0);    }    printf(_("Active AX.25 sockets\n"));    printf(_("Dest       Source     Device  State        Vr/Vs    Send-Q  Recv-Q\n"));    while (fgets(buffer, 256, f)) {	if (new == -1) {	    if (!strncmp(buffer, "dest_addr", 9)) {		new = 0;		continue;	/* old kernels have a header line */	    } else		new = 1;	}	/*	 * In a network connection with no user socket the Snd-Q, Rcv-Q	 * and Inode fields are empty in 2.0.x and '*' in 2.1.x	 */	sendq = 0;	recvq = 0;	if (new == 0) {	    dst = buffer;	    src = buffer + 10;	    dst[9] = 0;	    src[9] = 0;	    ret = sscanf(buffer + 20, "%s %d %d %d %*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d %*d %*d %d %d %*d",		   buf, &st, &vs, &vr, &sendq, &recvq);	    if (ret != 4 && ret != 6) {		printf(_("Problem reading data from %s\n"), _PATH_PROCNET_AX25);		continue;	    }	    dev = buf;	} else {	    p = buffer;	    while (*p != ' ') p++;	    p++;	    dev = p;	    while (*p != ' ') p++;	    *p++ = 0;	    src = p;	    while (*p != ' ') p++;	    *p++ = 0;	    dst = p;	    while (*p != ' ') p++;	    *p++ = 0;	    ret = sscanf(p, "%d %d %d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d %d %*d",		   &st, &vs, &vr, &sendq, &recvq);	    if (ret != 3 && ret != 5) {		    printf(_("problem reading data from %s\n"), _PATH_PROCNET_AX25);		    continue;	    }	    /*	     * FIXME: digipeaters should be handled somehow.	     * For now we just strip them.	     */	    p = dst;	    while (*p && *p != ',') p++;	    *p = 0;	}	printf("%-9s  %-9s  %-6s  %-11s  %03d/%03d  %-6d  %-6d\n",	       dst, src,	       dev,	       _(ax25_state[st]),	       vr, vs, sendq, recvq);    }    fclose(f);    return 0;}#endif#if HAVE_AFIPXstatic int ipx_info(void){    FILE *f;    char buf[256];    unsigned long txq, rxq;    unsigned int state;    unsigned int uid;    char *st;    int nc;    struct aftype *ap;    struct passwd *pw;    char sad[50], dad[50];    struct sockaddr sa;    unsigned sport = 0, dport = 0;    if (!(f = fopen(_PATH_PROCNET_IPX, "r"))) {	if (errno != ENOENT) {	    perror(_PATH_PROCNET_IPX);	    return (-1);	}	if (flag_arg || flag_ver)	    ESYSNOT("netstat", "AF IPX");	if (flag_arg)	    return (1);	else	    return (0);    }    printf(_("Active IPX sockets\nProto Recv-Q Send-Q Local Address              Foreign Address            State"));	/* xxx */    if (flag_exp > 1)	printf(_(" User"));	/* xxx */    printf("\n");    if ((ap = get_afntype(AF_IPX)) == NULL) {	EINTERN("netstat.c", "AF_IPX missing");	return (-1);    }    fgets(buf, 255, f);    while (fgets(buf, 255, f) != NULL) {	sscanf(buf, "%s %s %lX %lX %d %d",	       sad, dad, &txq, &rxq, &state, &uid);	if ((st = rindex(sad, ':'))) {	    *st++ = '\0';	    sscanf(st, "%X", &sport);	/* net byt order */	    sport = ntohs(sport);	} else {	    EINTERN("netstat.c", _PATH_PROCNET_IPX " sport format error");	    return (-1);	}	nc = 0;	if (strcmp(dad, "Not_Connected") != 0) {	    if ((st = rindex(dad, ':'))) {		*st++ = '\0';		sscanf(st, "%X", &dport);	/* net byt order */		dport = ntohs(dport);	    } else {		EINTERN("netstat.c", _PATH_PROCNET_IPX " dport format error");		return (-1);	    }	} else	    nc = 1;	switch (state) {	case TCP_ESTABLISHED:	    st = _("ESTAB");	    break;	case TCP_CLOSE:	    st = "";	    break;	default:	    st = _("UNK.");	    break;	}	/* Fetch and resolve the Source */	(void) ap->input(4, sad, &sa);	strcpy(buf, ap->sprint(&sa, flag_not));	snprintf(sad, sizeof(sad), "%s:%04X", buf, sport);	if (!nc) {	    /* Fetch and resolve the Destination */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -