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

📄 client.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <ip.h>#include <thread.h>#include "netbios.h"static char *hmsg = "headers";int chatty = 1;voidwarning(char *fmt, ...){	char err[128];	va_list arg;	va_start(arg, fmt);	vseprint(err, err+sizeof(err), fmt, arg);	va_end(arg);	syslog(1, "netbios-ns", err);	if (chatty)		print("%s\n", err);}static intudpannounce(void){	int data, ctl;	char dir[64];	char datafile[64+6];	/* get a udp port */	ctl = announce("udp!*!netbios-ns", dir);	if(ctl < 0){		warning("can't announce on netbios-ns udp port");		return -1;	}	snprint(datafile, sizeof(datafile), "%s/data", dir);	/* turn on header style interface */	if(write(ctl, hmsg, strlen(hmsg)) , 0)		abort(); /* hmsg */;	data = open(datafile, ORDWR);	if(data < 0){		close(ctl);		warning("can't announce on dns udp port");		return -1;	}	close(ctl);	return data;}#define BROADCAST 1voidlisten137(void *){		for (;;) {		uchar msg[Udphdrsize + 576];		int len = read(fd137, msg, sizeof(msg));		if (len < 0)			break;		if (len >= Udphdrsize) {			NbnsMessage *s;			Udphdr *uh;			uchar *p;			uh = (Udphdr*)msg;			p = msg + Udphdrsize;			len -= Udphdrsize;			s = nbnsconvM2S(p, len);			if (s) {				print("%I:%d -> %I:%d\n", uh->raddr, nhgets(uh->rport), uh->laddr, nhgets(uh->lport));				nbnsdumpmessage(s);				if (s->response) {					NbnsTransaction *t;					qlock(&transactionlist);					for (t = transactionlist.head; t; t = t->next)						if (t->id == s->id)							break;					if (t) {						sendp(t->c, s);					}					else						nbnsmessagefree(&s);					qunlock(&transactionlist);				}				else					nbnsmessagefree(&s);			}		}	}}voidusage(void){	print("usage: client [-u ipaddr] name\n");}voidthreadmain(int argc, char **argv){	int i;	NbName nbname;	int listen137thread;	uchar ipaddr[IPaddrlen];	int rv;	int broadcast = 1;	uchar serveripaddr[IPaddrlen];	ARGBEGIN {	case 'u':		broadcast = 0;		parseip(serveripaddr, ARGF());		break;	default:		usage();	} ARGEND;	if (argc == 0)		exits("");	nbmknamefromstring(nbname, argv[0]);	ipifc = readipifc("/net", nil, 0);	if (ipifc == nil || ipifc->lifc == nil) {		print("no network interface");		exits("");	}	fmtinstall('I', eipfmt);	ipmove(bcastaddr, ipifc->lifc->ip);	for (i = 0; i < IPaddrlen; i++)		bcastaddr[i] |= ~ipifc->lifc->mask[i];	print("broadcasting to %I\n", bcastaddr);//	setnetmtpt("/net");	fd137 = udpannounce();	listen137thread = proccreate(listen137, nil, 16384);	rv = nbnsaddname(broadcast ? nil : serveripaddr, nbname, 3000, ipifc->lifc->ip);	if (rv != 0)		print("error code %d\n", rv);	else		print("%I\n", ipaddr);	nbnsalarmend();	threadint(listen137thread);}

⌨️ 快捷键说明

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