/* SPX Communication Program */
# include <stdio.h>
# include <process.h>
# include <stdlib.h>
# include <mem.h>
# include <string.h>
# include <dos.h>
# include <bios.h>
# include <conio.h>
# include <graphics.h>
# include "key.h"
# include "spx.h"
# define TRUE 1
# define FALSE 0
int mouse_installed=FALSE;
int mDelay[32]= /* Two tager music */
{
5,5,5,5,5,
5,5,5,5,5,
10,5,5,10,
2,2,2,2,5,5,
2,2,2,2,5,5,
5,5,10,5,5,10
};
int mFreq[32]=
{
262,294,330,262,262,
294,330,262,330,349,
392,330,349,392,392,
440,392,349,330,262,
392,440,392,349,330,
262,294,196,262,294,
196,262
};
void scroll_screen(int startx,int starty,int endx,int endy,int k,int m);
void cls_screen1();
void cls_screen2();
void cls_screen3();
void cls_screen4();
int in_key();
int input_username(char *buf1,int flags);
int input_filename(char *buf2);
int cursor_upline(int curx,int cury);
int cursor_downline(int curx,int cury,int starty,int endy);
void cursor_backspace(int curx,int cury,int startx,int endx);
void information_win(char *buf3);
void goto_xy(int x,int y);
void draw_border(int startx,int starty,int endx,int endy);
void window_limit(int startx,int starty,int endx,int endy,int ch);
void win_limit(int startx,int endx,int ch);
int window_gets(int startx,int starty,int endx,int endy,unsigned char *s);
int win_gets(int startx,int endx,unsigned char *s);
SPXHEADER listen_header_list[5],receive_header_list[5],listen_header,send_header, call_header, term_header;
SPXECB listen_ECB_list[5],receive_ECB_list[5],send_ECB,listen_ECB,call_ECB, term_ECB;
/* SPX(Sepuence Packet eXchange) protocol schedule event of NOVELL network */
unsigned int Initialize()
{
union REGS inregs,outregs;
inregs.x.bx=SPX_Initialize;
inregs.h.al=0;
int86(0x7a,&inregs,&outregs);
outregs.h.ah=0;
return outregs.x.ax;
}
unsigned int OpenSocket(unsigned int socket)
{
union REGS inregs,outregs;
inregs.x.dx=socket;
inregs.x.bx=SPX_OpenSocket;
inregs.x.ax=0;
int86(0x7a,&inregs,&outregs);
return outregs.x.dx;
}
void CloseSocket(unsigned int socket)
{
union REGS inregs,outregs;
inregs.x.dx=socket;
inregs.x.bx=SPX_CloseSocket;
inregs.x.ax=0;
int86(0x7a,&inregs,&outregs);
}
void ListenForPacket(char *pointer, unsigned int length,unsigned int source_socket,unsigned int i)
{
union REGS inregs, outregs;
struct SREGS segregs;
memset( &receive_ECB_list[i],0,sizeof(SPXECB));
memset( &receive_header_list[i],0,sizeof(SPXHEADER));
receive_ECB_list[i].socket_number=source_socket;
receive_ECB_list[i].packet_count=2;
receive_ECB_list[i].packet[0].address=&receive_header_list[i];
receive_ECB_list[i].packet[0].length=sizeof(SPXHEADER);
receive_ECB_list[i].packet[1].address=pointer;
receive_ECB_list[i].packet[1].length=length;
segregs.es=FP_SEG((void far *)&receive_ECB_list[i]);
inregs.x.si=FP_OFF((void far *)&receive_ECB_list[i]);
inregs.x.bx=SPX_ListenForPacket;
int86x(0x7a,&inregs,&outregs,&segregs);
}
void ListenForConnection(unsigned int mysocket)
{
union REGS inregs,outregs;
struct SREGS segregs;
memset( &listen_ECB,0,sizeof(SPXECB));
memset( &listen_header,0,sizeof(SPXHEADER));
listen_ECB.socket_number=mysocket;
listen_ECB.packet_count=1;
listen_ECB.packet[0].address=&listen_header;
listen_ECB.packet[0].length=sizeof(SPXHEADER);
segregs.es=FP_SEG((void far *)&listen_ECB);
inregs.x.si=FP_OFF((void far *)&listen_ECB);
inregs.x.bx=SPX_ListenForConnection;
inregs.h.al=0x10;
inregs.h.ah=0;
int86x(0x7a,&inregs,&outregs,&segregs);
}
unsigned int GetConnectionNum(char *user_name)
{
union REGS inregs,outregs;
struct SREGS segregs;
struct {
unsigned int length;
unsigned char buffer_type;
unsigned int object_type;
unsigned char name_len;
unsigned char name[47];
}request_buffer;
struct {
unsigned int length;
unsigned char number_connections;
unsigned char connection_num[100];
}reply_buffer;
request_buffer.length=51;
request_buffer.buffer_type=0x15;
request_buffer.object_type=0x100;
request_buffer.name_len=(unsigned char)strlen(user_name);
strcpy(request_buffer.name,user_name);
reply_buffer.length=101;
segregs.ds=FP_SEG((void far *)&request_buffer);
inregs.x.si=FP_OFF((void far *)&request_buffer);
segregs.es=FP_SEG(( void far *)&reply_buffer);
inregs.x.di=FP_OFF((void far *)&reply_buffer);
inregs.h.ah=0xe3;
int86x(0x21,&inregs,&outregs,&segregs);
if(outregs.h.al!=0) return 0;
if(reply_buffer.number_connections==0) return 0;
outregs.h.ah=0;
outregs.h.al=reply_buffer.connection_num[0];
return outregs.x.ax;
}
unsigned int GetNetworkAddress(char connection_number,char *network_number,char *physical_address)
{
union REGS inregs,outregs;
struct SREGS segregs;
struct {
unsigned int length;
unsigned char buffer_type;
unsigned char connection_number;
}request_buffer;
struct{
unsigned int length;
unsigned char network_number[4];
unsigned char physical_address[6];
unsigned int server_socket;
}reply_buffer;
request_buffer.length=2;
request_buffer.buffer_type=0x13;
request_buffer.connection_number=connection_number;
reply_buffer.length=12;
segregs.ds=FP_SEG((void far *)&request_buffer);
inregs.x.si=FP_OFF((void far*)&request_buffer);
segregs.es=FP_SEG((void far *)&reply_buffer);
inregs.x.di=FP_OFF((void far *)&reply_buffer);
inregs.h.ah=0xe3;
int86x(0x21,&inregs,&outregs,&segregs);
memcpy(network_number,reply_buffer.network_number,4);
memcpy(physical_address,reply_buffer.physical_address,6);
outregs.h.ah=0;
return outregs.x.ax;
}
void ListenForSequencePacket( char *pointer,unsigned int length,unsigned int source_socket)
{
unsigned int i;
union REGS inregs,outregs;
struct SREGS segregs;
for(i=0;i<5;i++) {
memset(&listen_ECB_list[i],0,sizeof(SPXECB));
memset(&listen_header_list[i],0,sizeof(SPXHEADER));
listen_ECB_list[i].socket_number=source_socket;
listen_ECB_list[i].packet_count=2;
listen_ECB_list[i].packet[0].address=&listen_header_list[i];
listen_ECB_list[i].packet[0].length=sizeof(SPXHEADER);
listen_ECB_list[i].packet[1].address=pointer;
listen_ECB_list[i].packet[1].length=length;
segregs.es=FP_SEG((void far *)&listen_ECB_list[i]);
inregs.x.si=FP_OFF((void far *)&listen_ECB_list[i]);
inregs.x.bx=SPX_ListenForPacket;
int86x(0x7a,&inregs,&outregs,&segregs);
}
}
unsigned int EstablishConnection(unsigned int dest_connect_num,unsigned int source_socket)
{
union REGS inregs ,outregs;
struct SREGS segregs;
char network_number[4],physical_node[6];
memset(&call_ECB,0,sizeof(SPXECB));
memset(&call_header,0,sizeof(SPXHEADER));
GetNetworkAddress(dest_connect_num,&network_number[0],&physical_node[0]);
memcpy(call_header.dest_network_number,network_number,4);
memcpy(call_header.dest_network_node,physical_node,6);
call_header.dest_network_socket=receive_socket;
call_ECB.socket_number=source_socket;
评论0