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

📄 nbview.c

📁 NETBIOS C程序源代码 用于网络通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*============================================================*/
/*                          NbView.C                          */
/*============================================================*/

#include  "netbios.h"

/*------------------------------------------------------------*/

#define  MSG_SIZE	1001

char	message_out[MSG_SIZE];
char	message_in[MSG_SIZE];
char	string[MSG_SIZE];
char	string2[MSG_SIZE];
char	localname[17];
char	remotename[17];
BYTE	lsn;
BYTE	name_numbeer;
int	choice,x;
int	cursor_x,cursor_y;

/*------------------------------------------------------------*/

WORD	ncb_segments[10];
WORD	ncb_offsets[10];
WORD	volatile ncb_head=0;
WORD	ncb_tail=0;

/*------------------------------------------------------------*/

NCB	reset_ncb;
NCB	adapter_status_ncb;
NCB	session_status_ncb;

NCB	add_name_ncb;
NCB	add_group_name_ncb;
NCB	delete_name_ncb;

NCB	call_ncb;
NCB	listen_ncb;
NCB	send_ncb;
NCB	receive_ncb;
NCB	receive_any_ncb;
NCB	hangup_ncb;

NCB	send_dg_ncb;
NCB	receive_dg_ncb;
NCB	send_bcdg_ncb;
NCB	receive_bcdg_ncb;

NCB	temp_ncb;

/*------------------------------------------------------------*/

typedef	struct	{
		char	tb1_name[16];
		BYTE	tb1_name_number;
		BYTE	tb1_name_status;
		} NAME_TABLE;

typedef	struct	{
		BYTE		card_id[6];
		BYTE		unknown[52];
		int		name_count;
		NAME_TABLE	name_table[20];
		} ADAPTER_DATA;

typedef	struct	{
		BYTE	lsn;
		BYTE	state;
		char	local_name[16];
		char	remote_name[16];
		BYTE	recv_count;
		BYTE	send_count;
		} A_SESSION;

typedef	struct	{
		BYTE		name_num;
		BYTE		session_count;
		BYTE		junk1;
		BYTE		junk2;
		A_SESSION	session_data[40];
		} STATUS_INFO;

ADAPTER_DATA	adapter_data;
STATUS_INFO	session_info;

/*------------------------------------------------------------*/

WOED	es_reg,bx_reg;
void	interrupt(*int_5C_vector)(void);
char	screen_save[4000];

char	*state_msg[7]=	{
			"                ",
			"listen pending",
			"call pending",
			"active session",
			"hang up pending",
			"hang up complete",
			"session abort"
			};

int	name_type;
char	*name_type_msg[2]={
			  "Unique Name",
			  "Group Name"
			  };

int	name_status;
char	*name_status_msg[8]={
			    "Reg. in progress  ",
			    "                  ",
			    "                  ",
			    "                  ",
			    "Registered        ",
			    "De_registered     ",
			    "Dup1 detected     ",
			    "Dup1; dereg pend. "
			    };

BYTE	*box[3]={
		"+-------------[NetTest Post Results]-------------+"
		"|                                                |"
		"+------------------------------------------------+"
		}

char	*error_message[]={
	"success",		"invalid buffer length",
	"ret code 02",		"invalid command",
	"ret code 04",		"timed out",
	"buffer too small",	"ret code 07",
	"invalid session num",	"no resource",
	"session closed",	"command cancelled",
	"ret code 0C",		"dupl. local name",
	"name table full",	"actie session",
	"ret code 10",		"session table full",
	"no one listening",	"invalid name num",
	"no answer",		"no local name",
	"name in use",		"name is deleted",
	"abnormal end",		"name conflict",
	"ret code 1A",		"ret code 1B",
	"ret code 1C",		"ret code 1D",
	"ret code 1E",		"ret code 1F",
	"ret code 20",		"card busy",
	"too many cmds",	"invalid card num",
	"cancel done",		"ret code 25",
	"cannot cancel"
	}
/*------------------------------------------------------------*/
void	NetBios(NCB far *ncb_ptr)
	{
	_ES=FP_SEG(ncb_ptr);
	_BX=FP_OFF(ncb_ptr);
	geninterrupt(0x5C);
	}
/*------------------------------------------------------------*/
void	expand_to_16_chars(char *name)
	{
	char *p;
	int  len;

	len=strlen(name);
	for(p=name+len;p<name+15;*p++=' ');
	name[15]='\0';
	}
/*------------------------------------------------------------*/
void	report_result(void)
	{
	int i,j;
	
	gettext(1,1,80,25,screen_save);
	cursor_x=wherex();
	cursor_y=wherey();
	clrscr();
	gotoxy(5,1);
	cprintf("%s",box[0]);
	for(i=1;i<20;i++)
		{
		gotoxy(5,i+1);
		cprintf("%s",box[1]);
		}
	gotoxy(5,21);
	cprintf("%s",box[2]);
	window(7,2,69,20);
	movedata(ncb_segments[ncb_tail],ncb_offsets[ncb_tail],\
		 FP_SEG(&temp_ncb),FP_OFF(&temp_ncb),sizeof(NCB));
	ncb_tail++;
	if(ncb_tail==10)   ncb_tail=0;
	if(temp_ncb.NCB_LENGTH==MSG_SIZE-1)   temp_ncb.NCB_LENGTH=0;
	if(temp_ncb.NCB_LENGTH>320)    temp_ncb.NCB_LENGTH=320;

	switch(temp_ncb.NCB_COMMAND) {
		case RESET	     : strcpy(string,"RESET ADAPTER");  break;
		case ADAPTER_STATUS  : strcpy(string,"ADAPTER STATUS"); break;

		case ADD_NAME        : strcpy(string,"ADD NAME");       break;
		case ADD_GROUP_NAME  : strcpy(string,"ADD GROUP NAME"); break;
		case DELETE_NAME     : strcpy(string,"DELETE NAME");    break;
		case LISTEN 	     : strcpy(string,"LISTEN"); 	break;
		case CALL	     : strcpy(string,"CALL");        	break;
		case HANG_UP	     : strcpy(string,"HANG_UP");  	break;
		case SEND	     : strcpy(string,"SEND");  		break;
		case RECEIVE         : strcpy(string,"RECEIVE");  	break;
		case RECEIVE_ANY     : strcpy(string,"RECEIVE_ANY");  	break;
		case SESSION_STATUS  : strcpy(string,"SESSION_STATUS"); break;

		case SEND_DATAGRAM   : strcpy(string,"SEND DATAGRAM");  break;
		case RECEIVE_DATAGRAM: strcpy(string,"RECEIVE DATAGRAM");  break;
		case SEND_BC_DATAGRAM:
			strcpy(string,"SEND BROADCAST DATAGRAM");  break;
		case RECEIVE_BC_DATAGRAM: 
			strcpy(string,"RECEIVE BROADCAST DATAGRAM");  break;
		default: strcpy(string,"<UNKNOWN>"); break;
		}
	gotoxy(1,1);
	cprintf("Command: %s",string);

	if(temp_ncb.NCB_RETCODE<=0x26)
		{
		strcpy(string,error_message[temp_ncb.NCB_RETCODE]);
		}
        else
		{
		if(temp_ncb.NCB_RETCODE==0xFF)
			{
			strcpy(string,"Command Panding");
		else
			{
			strcpy(string,"Adapter Malfunction");
			}
		}

	if(temp_ncb.NCB_CMD_CPLT<=0x26)
		{
		strcpy(string2,error_message[temp_ncb.NCB_CMD_CPLT]);
		}
        else
		{
		if(temp_ncb.NCB_CMD_CPLT==0xFF)
			{
			strcpy(string2,"Command Panding");
		else
			{
			strcpy(string2,"Adapter Malfunction");
			}
		}

	gotoxy(1,2);
	cprintf("Immed: %s. Final: %s.",string,string2);

	if(temp_ncb.NCB_RETCODE>0 || temp_ncb.NCB_CMD_CPLT>0)
		{
		goto report_exit;
		}

	if(temp_ncb.NCB_COMMAND==ADAPTER_STATUS)
		{
		gotoxy(1,4);
		cprintf("Card ID(hex):");
		for(i=0;i<6;i++)
			{
			cprintf("%2.2X",(int)adapter_data.card_id[i]);
			}
		gotoxy(1,6);
		cprintf("NetBios Data Block(hex):");
		for(i=0,j=7;i<52;i++)
			{
			if(i%16==0)  gotoxy(1,j++);
			cprintf("%2.2X",(int)adapter_data.unknown[i]);
			}
		gotoxy(1,14);
		cprintf("Local name table item:%d"adapter_data.name_count);
		gotoxy(23,19);
		cprintf("(Press a key)");
		bioskey(0);
		if(adapter_data.name_count==0)  goto report_exit;

		clrscr();
		for(i=0,j=2;i<adapter_data.name_count;i++)
			{
			adapter_data.name_table[i].tbl_name[15]='\0';
			name_status=(int)adapter_data.name_table[i].tbl_name_status;
			name_status&=ox0007;
			name_type=(int)adapter_data.name_table[i].tbl_name_status;
			name_type&=0x0080;
			name_type=(name_type==0x0080)?1:0;
			if(i>9)
				{
				gotoxy(23,19);
				cprintf("(Press a key)");
				bioskey(0);
				clrscr();
				j=2;
				}
			gotoxy(1,j++);
			cprintf("%s (#%d) %s %s",adapter_data.name_table[i].tbl_name,\
				(int)adapter_data.name_table[i].tbl_name_number,
				name_status_msg[name_status],name_type_msg[name_type]);
			}
		}
	else
	    switch(temp_ncb.NCB_COMMAND)
		{
		case  ADD_NAME:
		case  ADD_GROUP_NAME:
		  gotoxy(1,5);
		  cprintf("Name number=%d.",(int)temp_ncb.NCB_NUM);
		  break;
		case  CALL:
		  gotoxy(1,5);
		  cprintf("Session establish. LSN=%d.",(int)temp_ncb.NCB_LSN);
		  break;
		case  LISTEN:
		  gotoxy(1,5);
		  strncpy(string,temp_ncb.NCB_CALLNAME,16);
		  string[16]='\0';
		  cprintf("Session establish with '%s'. LSN=%d.",\
			  string,(int)temp_ncb.NCB_LSN);
		  break;
		case  RECEIVE:
		case  RECEIVE_ANY:
		  gotoxy(1,5);
		  cprintf("Message Says:")
		  for(i=0,j=6;i<temp_ncb.NCB_LENGTH;i++)
			{
			if(i%60==0)  gotoxy(1,j++);
			cprintf("%c",message_in[i]);
			}
		  break;
		case  SESSION_STATUS:
		  gotoxy(1,4);
		  cprintf("Name:%d  Session:%d",\
			   (int)session_info.name_num,(int)session_info.session_count);
		  if(session_info.session_count==0)  goto report_exit;
		  j=5;
		  for(i=0;i<session_info.session_count;i++)
			{
			if(i>5)
			    {
			    gotoxy(23,19);
			    cprintf("(Press a key)");
			    bioskey(0);
			    clrscr();
			    j=5;
			    }
			gotoxy(1,j++);
			cprintf("lsn=%d (%s) recvcount=%d sendcount=%d",\
				 (int)session_info.session_data[i].lsn, \
				 state_msg[(int)session_info.session_data[i].state],\
				 (int)session_info.session_data[i].recv_count,\
				 (int)session_info.session_data[i].send_count);
			gotoxy(1,j++);
			session_info.session_data[i].local_name[15]='\0';
			session_info.session_data[i].remote_name[15]='\0';
			cprintf("localname='%s' remotename='%s'",\
				 session_info.session_data[i].local_name,\
				 session_info.session_data[i].remote_name);
			}
		  break;

⌨️ 快捷键说明

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