Интранет сети
Информация - Радиоэлектроника
Другие материалы по предмету Радиоэлектроника
доставки +---------
--------------------
сеть отправителя
--------------------
Сетевой адрес -
отправителя - хост отправителя -
- -
--------------------
порт отправителя
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,®s,®s,&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, ®s, ®s, &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;
&