网站正在建设中mp4,企业网站优化做什么,贵阳网站建设是什么,做网站需要会编程语言吗今天的程序员普遍遵循这样的接口设计原则#xff1a;通过不同的接口名和参数列表准确表达不同的功能。 这似乎是理所当然的#xff0c;然而上古时代却并非如此#xff0c;比如Netbios协议整个协议的接口只有一个函数、一个参数#xff01; 当初是基于什么原则这样设计不晓得… 今天的程序员普遍遵循这样的接口设计原则通过不同的接口名和参数列表准确表达不同的功能。 这似乎是理所当然的然而上古时代却并非如此比如Netbios协议整个协议的接口只有一个函数、一个参数 当初是基于什么原则这样设计不晓得但它确实真真实实地存在过最初是在windows 2000上实现的到了windows vista就被淘汰。 我之所以用到这个东西是为了取得局域网上的机器名代码如下
//取得MACHNAME
STATE getmachname(char * ip,char * machname,int machnamelen)
{if(machnamelen16){return -1;}//以下使用sockethostent * phost;unsigned long addr;if(INADDR_NONE(addrinet_addr(ip)))return -1;if(NULL!(phostgethostbyaddr((char *)addr,4,PF_INET))){if((int)strlen(phost-h_name)machnamelen)return -1;else{strcpy(machname,phost-h_name);return 1;}}//以下使用NetBIOSchar ncb_buffer[sizeof(ADAPTER_STATUS)256*sizeof(NAME_BUFFER)];UCHAR ret;NCB ncb;ADAPTER_STATUS * adapter_status;NAME_BUFFER * name_buffer;int lanacount;memset(ncb,0,sizeof(NCB));memset(ncb_buffer,0xa3,sizeof(ADAPTER_STATUS)256*sizeof(NAME_BUFFER));adapter_status(ADAPTER_STATUS *)ncb_buffer;name_buffer(NAME_BUFFER *)(ncb_buffersizeof(ADAPTER_STATUS));ncb.ncb_lana_num0;ncb.ncb_lsn0;ncb.ncb_num0;ncb.ncb_commandNCBRESET;
// if(NRC_GOODRET!(retNetbios(ncb))){
// return -2;}for(lanacount0;lanacount0;lanacount){memset(ncb,0,sizeof(NCB));memset(ncb_buffer,0xa3,sizeof(ADAPTER_STATUS)256*sizeof(NAME_BUFFER));//设置输入ncb.ncb_commandNCBASTAT;ncb.ncb_buffer(unsigned char *)ncb_buffer;ncb.ncb_lengthsizeof(ADAPTER_STATUS)256*sizeof(NAME_BUFFER);memset((char *)ncb.ncb_callname, ,15);ncb.ncb_callname[15]\0;memcpy((char *)ncb.ncb_callname,ip,strlen(ip));//预先设置输出无意义name_buffer-name[0]\0;ncb.ncb_lana_num(UCHAR)lanacount;if(NRC_GOODRET(retNetbios(ncb))){break;}else{// showret(ret);}}if(0lanacount){return -3;}memcpy(machname,name_buffer[0].name,16);return 1;
}因为取机器名比较困难所以我同时使用了socket函数和Netbios。具体代码无关紧要了因为早已经过时主要目的是看看Netbios接口有多令人震惊。 Netbios接口如下
UCHAR Netbios(PNCB pncb
); 好简洁啊真是令人赞叹 只有一个参数是个指针指向这个
typedef struct _NCB {UCHAR ncb_command;UCHAR ncb_retcode;UCHAR ncb_lsn;UCHAR ncb_num;PUCHAR ncb_buffer;//这是个指针WORD ncb_length;UCHAR ncb_callname[NCBNAMSZ];UCHAR ncb_name[NCBNAMSZ];UCHAR ncb_rto;UCHAR ncb_sto;void()(_NCB *) * ncb_post;//这里又是一个指针UCHAR ncb_lana_num;UCHAR ncb_cmd_cplt;
#if ...UCHAR ncb_reserve[18];
#elseUCHAR ncb_reserve[10];
#endifHANDLE ncb_event;
} NCB, *PNCB; 这个结构里面还包括一个指向这种结构的指针也就是可以无限级联下去。 第一个成员ncb_command是命令我大概数了一下有26种命令也就是这个结构有26种解释。 每种命令仅仅使用其它成员的一小部分。其中ncb_buffer指针指向的结构视命令不同而不同。比如某个命令要求ncb_buffer指向这个结构
typedef struct _SESSION_HEADER {UCHAR sess_name;UCHAR num_sess;UCHAR rcv_dg_outstanding;UCHAR rcv_any_outstanding;
} SESSION_HEADER, *PSESSION_HEADER; 类似的结构体有八个。 虽说按照说明书往下啃是可以理解全部的但确实有一种啃单片机手册的感觉。 这个东西被淘汰了该 这里是结束