📄 client.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 + -