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

📄 ipx.h

📁 IPX协议C程序源代码:用于网络通信
💻 H
字号:
struct  IPXECB					//ECB结构定义
{
 void far       *link_address;
 void far       (*event_service_routine)(void);
 unsigned char  in_use;
 unsigned char  completion_code;
 unsigned int   socket_number;
 unsigned char  ipx_workspace[4];
 unsigned char  driver_workspace [12];
 unsigned char  immediate_address[ 6];
 unsigned int   packet_count;
 struct {
	void far   *address;
	unsigned int length;
	} packet [2];
 };

struct IPXHEADER				//IPX分组头定义
{
 unsigned int   checksum;
 unsigned char  length[2];
 unsigned char  transport_control;
 unsigned char  packet_type;
 unsigned char  dest_network_number [4];
 unsigned char  dest_network_node   [6];
 unsigned int   dest_network_socket;
 unsigned char  source_network_number [4];
 unsigned char  source_network_node   [6];
 unsigned int   source_network_socket;
 };

 int  ipx_spx_installed(void);
 int  ipx_cancel_event(struct IPXECB *ecb_ptr);
 void close_socket(unsigned int socket);
 int  open_socket(unsigned int socket);
 int  get_local_target(unsigned char *dest_network,
		       unsigned char *dest_node,
		       unsigned int  dest_socket,
		       unsigned char *bridge_address);
 void ipx_relinquish_control(void);
 void ipx_listen_for_packet(struct IPXECB *ecb_ptr);
 void ipx_send_packet(struct IPXECB *ecb_ptr);
 int  get_internet_address(unsigned char connection_number,
			   unsigned char *network_number,
			   unsigned char *physical_node);
 unsigned int get_1st_connection_num(char *who);
 unsigned char get_connection_number(void);
 void get_user_id(unsigned char connection_number,
		  unsigned char *user_id);
 unsigned int get_interval_marker(void);
 void get_network_address(unsigned char *network_number,
			  unsigned char *physical_node);
 void ipx_schedule_ipx_event(struct IPXECB far *ecb_ptr,
			     unsigined int ticks);

void far   (*ipx_spx)(void);			//IPX安装检测
int  ipx_spx_installed(void)
	{
	union  REGS  regs;
	struct SREGS sregs;

	regs.x.ax=0x7a00;
	int86x(0x2f,&regs,&regs,&sregs);
	if (regs.h.al!=0xff) return -1;
	ipx_spx=MK_FP(sregs.es,regs.x.di);
	_BX=0x0010;
	_AL=0x00;
	ipx_spx();
	if (_AL==0x00) return 0;
	return 1;
	}
int ipx_cancel_event(struct IPXECB *ecb_ptr)	//取消IPX/SPX事件
	{
	_ES=FP_SEG( (void far *) ecb_ptr);
	_SI=FP_OFF( (void far *) ecb_ptr);
	_BX=0x0006;
	ipx_spx();
	_AH=0;
	return _AX;
	}
void close_socket(unsigned int socket)		//关闭管套
	{
	if (ipx_spx_installed()<1)return;
	_BX=0x0001;
	_DX=socket;
	ipx_spx();
	}
int open_socket(unsigned int socket)		//打开管套
	{
	if (ipx_spx_installed()<1) return -1;
	_DX=socket;
	_BX=0x0000;
	_AL=0xff;
	ipx_spx();
	_AH=0;
	return _AX;
	}
int get_local_target(unsigned char *dest_network,
		     unsigned char *dest_node,
		     unsigned int  dest_socket,
		     unsigned char *bridge_address)

						//获取本地目标
	{
	unsigned int temp_ax;
	struct{
		unsigned char  network_number [4];
		unsigned char  physical_node  [6];
		unsigned int   socket;
	      } request_buffer;
	struct{
		unsigned char   local_target [6];
	      } reply_buffer;

	memcpy(request_buffer.network_number,dest_network,4);
	memcpy(request_buffer.physical_node,dest_node,6);
	request_buffer.socket=dest_socket;
	_ES=FP_SEG((void far *)&request_buffer);
	_SI=FP_OFF((void far *)&request_buffer);
	_DI=FP_OFF((void far *)&reply_buffer);
	_BX=0x0002;
	ipx_spx();
	_AH=0;
	temp_ax=_AX;
	memcpy(bridge_address,reply_buffer.local_target,6);
	return temp_ax;
	}
 void ipx_relinquish_control(void)
	{
	_BX=0x000a;
	ipx_spx();
	}
void ipx_listen_for_packet(struct IPXECB *ecb_ptr)	//帧听分组
	{
	_ES=FP_SEG( (void far *) ecb_ptr);
	_SI=FP_OFF( (void far *) ecb_ptr);
	_BX=0x0004;
	ipx_spx();
	}
void ipx_send_packet(struct IPXECB *ecb_ptr)	//发送分组
	{
	_ES=FP_SEG((void far*)ecb_ptr);
	_SI=FP_OFF((void far*)ecb_ptr);
	_BX=0x0003;
	ipx_spx();
	}
int  get_internet_address(unsigned char connection_number,
			  unsigned char *network_number,
			  unsigned char *physical_node)

						//获取互连网地址
	{
	union REGS  regs;
	struct SREGS sregs;

	struct{
		unsigned int len;
		unsigned char buffer_type;
		unsigned char connection_number;
	      } request_buffer;
	struct{
		unsigned int len;
		unsigned char network_number[4];
		unsigned char physical_node [6];
		unsigned int server_socket;
	      } reply_buffer;

	regs.h.ah=0xe3;
	request_buffer.len=2;
	request_buffer.buffer_type=0x13;
	request_buffer.connection_number=connection_number;
	reply_buffer.len=12;
	regs.x.si=FP_OFF((void far *)&request_buffer);
	sregs.ds=FP_SEG((void far *)&request_buffer);
	regs.x.di=FP_OFF((void far *)&reply_buffer);
	sregs.es=FP_SEG((void far *)&reply_buffer);
	int86x(0x21,&regs,&regs,&sregs);
	memcpy(network_number,reply_buffer.network_number,4);
	memcpy(physical_node,reply_buffer.physical_node,6);
	regs.h.ah=0;
	return regs.x.ax;
	}
unsigned int get_1st_connection_num(char *who)	//获取第一连接号
	{
	union REGS regs;
	struct SREGS sregs;

	struct{
		unsigned int len;
		unsigned char buffer_type;
		unsigned int object_type;
		unsigned char name_len;
		unsigned char name [47];
	      } request_buffer;
	struct{
		unsigned int len;
		unsigned char number_connections;
		unsigned char connection_num [100];
	      } reply_buffer;

	regs.h.ah=0xe3;
	request_buffer.len=51;
	request_buffer.buffer_type=0x15;
	request_buffer.object_type=0x0100;
	request_buffer.name_len=(unsigned char) strlen(who);
	strcpy(request_buffer.name,who);
	reply_buffer.len=101;
	regs.x.si=FP_OFF((void far *)&request_buffer);
	sregs.ds=FP_SEG((void far *)&request_buffer);
	regs.x.di=FP_OFF((void far *)&reply_buffer);
	sregs.es=FP_SEG((void far *)&reply_buffer);
	int86x(0x21,&regs,&regs,&sregs);
	if (regs.h.al!=0) return 0;
	if (reply_buffer.number_connections==0) return 0;
	regs.h.ah=0;
	regs.h.al=reply_buffer.connection_num[0];
	return regs.x.ax;
	}
unsigned char get_connection_number(void)	
	{
	_AH=0xdc;
	geninterrupt(0x21);
	return _AL;
	}
void get_user_id(unsigned char connection_number,
		 unsigned char *user_id)

						//获取用户ID
	{
	union REGS regs;
	struct SREGS sregs;
	struct 	{
		unsigned int len;
		unsigned char buffer_type;
		unsigned char connection_number;
		}request_buffer;
	 struct {
		unsigned int len;
		unsigned char object_id[4];
		unsigned char obrect_type[2];
		char object_name[48];
		char login_time[7];
		}reply_buffer;

	 regs.h.ah=0xe3;
	 request_buffer.len=2;
	 request_buffer.buffer_type=0x16;
	 request_buffer.connection_number=connection_number;
	 reply_buffer.len=61;
	 regs.x.si=FP_OFF((void far *)&request_buffer);
	 sregs.ds=FP_SEG((void far *)&request_buffer);
	 regs.x.di=FP_OFF((void far *)&reply_buffer);
	 sregs.es=FP_SEG((void far *)&reply_buffer);
	 int86x(0x21,&regs,&regs,&sregs);
	 strncpy(user_id,reply_buffer.object_name,48);
	 }
unsigned int get_interval_marker(void)		//获取时间间隔标志
	{
	_BX=0x0008;
   	ipx_spx();
   	return _AX;
	}
void get_network_address( unsigned char *network_number,
			  unsigned char *physical_node)
	{
	union REGS regs;
	struct SREGS sregs;

	struct	{
		unsigned char network_number[4];
		unsigned char physical_node [6];
		}reply_buffer;

	regs.x.di=FP_OFF((void far *)&reply_buffer);
	sregs.es=FP_SEG((void far *)&reply_buffer);
	_BX=0x0009;
	ipx_spx();
	memcpy(network_number,reply_buffer.network_number,4);
	memcpy(physical_node,reply_buffer.physical_node,6);
	}

void ipx_schedule_ipx_event(struct IPXECB far *ecb_ptr,unsigined int ticks)
	{
	_ES=FP_SEG((VOID FAR *)ecb_ptr);
	_SI=FP_OFF((VOID FAR *)ecb_ptr);
	_BX=0x0005;
	_AX=ticks;
	ipx_spx();
	}




⌨️ 快捷键说明

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