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

📄 inet.c

📁 柯老师网站上找到的
💻 C
字号:
/* * Copyright (c) 1991 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Lawrence Berkeley Laboratory, * Berkeley, CA.  The name of the University may not be used to * endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */static const char rcsid[] =    "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/emulate/inet.c,v 1.5 2000/02/08 23:35:13 salehi Exp $ (LBL)";#include <stdlib.h>#include <string.h>#include <ctype.h>#ifdef WIN32#include <windows.h>#include <winsock.h>#else#include <sys/param.h>#include <netdb.h>#include <sys/socket.h>#include <unistd.h>#endif#include "config.h"#include "inet.h"u_int32_tLookupHostAddr(const char *s){	if (isdigit(*s))		return (u_int32_t)inet_addr(s);	else {		struct hostent *hp = gethostbyname(s);		if (hp == 0)			/*XXX*/			return (0);		return *((u_int32_t **)hp->h_addr_list)[0];	}}u_int32_tLookupLocalAddr(void){	static u_int32_t local_addr;	char name[MAXHOSTNAMELEN];		if (local_addr == 0) {		(void)gethostname(name, sizeof(name));		local_addr = LookupHostAddr(name);	}	return (local_addr);}/* * A faster replacement for inet_ntoa(). * Extracted from tcpdump 2.1. */const char *intoa(u_int32_t addr){	register char *cp;	register u_int byte;	register int n;	static char buf[sizeof(".xxx.xxx.xxx.xxx")];	NTOHL(addr);	cp = &buf[sizeof buf];	*--cp = '\0';	n = 4;	do {		byte = addr & 0xff;		*--cp = byte % 10 + '0';		byte /= 10;		if (byte > 0) {			*--cp = byte % 10 + '0';			byte /= 10;			if (byte > 0)				*--cp = byte + '0';		}		*--cp = '.';		addr >>= 8;	} while (--n > 0);	return cp + 1;}char *InetNtoa(u_int32_t addr){	const char *s = intoa(addr);	char *p = (char *)malloc(strlen(s) + 1);	strcpy(p, s);	return p;}char *LookupHostName(u_int32_t addr){	char *p;	struct hostent* hp;	/*XXX*/	if (IN_MULTICAST(ntohl(addr)))		return (InetNtoa(addr));	hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);	if (hp == 0) 		return InetNtoa(addr);	p = (char *)malloc(strlen(hp->h_name) + 1);	strcpy(p, hp->h_name);	return p;}/*   * in_cksum -- *      Checksum routine for Internet Protocol family headers (C Version) *	[taken from ping.c] */ u_short  in_cksum(addr, len)        u_short *addr;         int len;{           register int nleft = len;               register u_short *w = addr;        register int sum = 0;        u_short answer = 0;            /*                               * Our algorithm is simple, using a 32 bit accumulator (sum), we add         * sequential 16 bit words to it, and at the end, fold back all the         * carry bits from the top 16 bits into the lower 16 bits.         */              while (nleft > 1)  {                sum += *w++;                nleft -= 2;        }                   /* mop up an odd byte, if necessary */        if (nleft == 1) {                *(u_char *)(&answer) = *(u_char *)w ;                sum += answer;        }        /* add back carry outs from top 16 bits to low 16 bits */        sum = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */        sum += (sum >> 16);                     /* add carry */        answer = ~sum;                          /* truncate to 16 bits */        return(answer);}#include <netinet/in_systm.h>#include <netinet/ip.h>#include <stdio.h>voidprint_ip(struct ip *ip){	char buf[64];	u_short off = ntohs(ip->ip_off);	printf("IP v:%d, ihl:%d, tos:%d, id:%d, off:%d [df:%d, mf:%d], sum:%d, prot:%d\n",		ip->ip_v, ip->ip_hl, ip->ip_tos, ntohs(ip->ip_id),		off & IP_OFFMASK,		(off & IP_DF) ? 1 : 0,		(off & IP_MF) ? 1 : 0,		ip->ip_sum, ip->ip_p);#ifdef HAVE_ADDR2ASCII	addr2ascii(AF_INET, &ip->ip_src, 4, buf);#else	inet_ntoa(ip->ip_src);#endif /* HAVE_ADDR2ASCII */#ifdef HAVE_ADDR2ASCII	printf("IP len:%d ttl: %d, src: %s, dst: %s\n",		ntohs(ip->ip_len), ip->ip_ttl, buf,			addr2ascii(AF_INET, &ip->ip_dst, 4, 0));#else	printf("IP len:%d ttl: %d, src: %s, dst: %s\n",		ntohs(ip->ip_len), ip->ip_ttl, buf,	       inet_ntoa(ip->ip_src));#endif /* HAVE_ADDR2ASCII */}

⌨️ 快捷键说明

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