Интранет сети

Информация - Радиоэлектроника

Другие материалы по предмету Радиоэлектроника

доставки +---------

--------------------

сеть отправителя

--------------------

Сетевой адрес -

отправителя - хост отправителя -

- -

--------------------

порт отправителя

L====================-

--

г====================

0 -546 байтов

Данные

прозрачных данных +------

---------

доп.байт

L===================-

--

 

 

Рис. 2.3.

 

 

 

2.5. Программный интерфейс IPX

 

IPX использует блок управления событиями для координации и акти-

визации определенных операций. Могут возникать два типа событий:

события, связанные с приемопередачей и события специального назна-

чения, определяемые прикладной программой. Услуги IPX по приему и

передаче включают в себя следующее:

 

a. открыть порт;

b. закрыть порт;

c. получить локальную цель;

d. послать пакет;

e. получить межсетевой адрес;

f. сбросить управление;

g. отсоединиться от цели.

 

События специального назначения управляются посредством

Asynchronons Event Sheduler (AES), встроенного в IPX. AES является

дополнительным сервисом, обеспечивающим также средства измерения

затраченного времени и переключения событий в соответствии с отме-

ренными интервалами времени. Программный интерфейс AES включает в

себя следующие услуги:

 

a. планирование события IPX;

b. подавление события;

c. планирование специального события;

d. получение маркера интервала.

 

Протокол IPX предназначен для использования в качестве фунда-

мента для построения сложных прикладных систем, включая серверы

связи, шлюзы или системы прямого взаимодействия.

 

Тест наличия IPX в памяти использует мультиплексное прерывание

2F. Ниже приводится текст функции, возвращающей 1, если IPX уста-

новлен.

 

void far (*ipx_spx)(void)

 

int ipx_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);

return 1;

}

 

/*

*

*

*/

 

struct IPXHEADER

{

unsigned int checksum;

unsigned int length;

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;

};

 

struct ECB

{

void far *link_address;

void far (*event_service_routine)(void);

unsigned char in_use;

unsigned char completion_code;

unsigned int socket_number;

unsigned int connection_id; /* returned by Listen */

unsigned int rest_of_workspace;

unsigned char driver_workspace [12];

unsigned char immediate_address [ 6];

unsigned int packet_count;

struct {

void far *address;

unsigned int length;

} packet [2];

};

 

 

int ipx_spx_installed(void);

int ipx_cancel_event(struct ECB *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 let_ipx_breath(void);

void ipx_listen_for_packet(struct ECB *ecb_ptr);

void ipx_send_packet(struct ECB *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);

 

/*

* IPX.C -- helper routines for accessing IPX services

* from Turbo C.

*/

 

#include

#include

#include

#include

#include

 

void far (*ipx_spx)(void);

 

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 ECB *ecb_ptr)

{

_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;

&