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

📄 main.c

📁 unix网络编程卷1:套接口API的全书源码
💻 C
字号:
/* include main1 */#include	"udpcksum.h"			/* DefinE global variables */struct sockaddr	*dest, *local;struct sockaddr_in locallookup;socklen_t		destlen, locallen;int		datalink;		/* from pcap_datalink(), in <net/bpf.h> */char   *device;			/* pcap device */pcap_t *pd;				/* packet capture struct pointer */int		rawfd;			/* raw socket to write on */int		snaplen = 200;	/* amount of data to capture */int		verbose;int		zerosum;		/* send UDP query with no checksum */static void	usage(const char *);intmain(int argc, char *argv[]){	int				c, lopt=0;	char			*ptr, localname[1024], *localport;	struct addrinfo	*aip;/* end main1 *//* include main2 */	opterr = 0;		/* don't want getopt() writing to stderr */	while ( (c = getopt(argc, argv, "0i:l:v")) != -1) {		switch (c) {		case '0':			zerosum = 1;			break;		case 'i':			device = optarg;			/* pcap device */			break;		case 'l':			/* local IP address and port #: a.b.c.d.p */			if ( (ptr = strrchr(optarg, '.')) == NULL)				usage("invalid -l option");			*ptr++ = 0;					/* null replaces final period */			localport = ptr;			/* service name or port number */			strncpy(localname, optarg, sizeof(localname));			lopt = 1;			break;		case 'v':			verbose = 1;			break;		case '?':			usage("unrecognized option");		}	}/* end main2 *//* include main3 */	if (optind != argc-2)		usage("missing <host> and/or <serv>");		/* 4convert destination name and service */	aip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);	dest = aip->ai_addr;		/* don't freeaddrinfo() */	destlen = aip->ai_addrlen;	/*	 * Need local IP address for source IP address for UDP datagrams.	 * Can't specify 0 and let IP choose, as we need to know it for	 * the pseudoheader to calculate the UDP checksum.	 * If -l option supplied, then use those values; otherwise,	 * connect a UDP socket to the destination to determine the right	 * source address.	 */	if (lopt) {		    /* 4convert local name and service */	    aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);	    local = aip->ai_addr;		/* don't freeaddrinfo() */	    locallen = aip->ai_addrlen;	} else {		int s;		s = Socket(AF_INET, SOCK_DGRAM, 0);		Connect(s, dest, destlen);		/* kernel chooses correct local address for dest */		locallen = sizeof(locallookup);	    local = (struct sockaddr *)&locallookup;		Getsockname(s, local, &locallen);		if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))			err_quit("Can't determine local address - use -l\n");		close(s);	}	open_output();		/* open output, either raw socket or libnet */	open_pcap();		/* open packet capture device */	setuid(getuid());	/* don't need superuser privileges anymore */	Signal(SIGTERM, cleanup);	Signal(SIGINT, cleanup);	Signal(SIGHUP, cleanup);	test_udp();	cleanup(0);}/* end main3 */static voidusage(const char *msg){	err_msg("usage: udpcksum [ options ] <host> <serv>\n""options: -0    send UDP datagram with checksum set to 0\n""         -i s  packet capture device\n""         -l a.b.c.d.p  local IP=a.b.c.d, local port=p\n""         -v    verbose output");	if (msg[0] != 0)		err_quit("%s", msg);	exit(1);}

⌨️ 快捷键说明

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