📄 ipx.c
字号:
}
head.source = *ipx_get_local_net_number();
head.dest.socket = reverse_word(dest_socket);
head.source.socket = reverse_word(source_socket);
return &head;
}
char *ipx_get_ecb_inuse_string(ipx_ecb_struct far *ecb)
{
static char s[80];
switch(ecb->inuse)
{
case 0x0000: strcpy(s, "available"); break;
case 0x00E0: strcpy(s, "AES temporary"); break;
case 0x00F6: strcpy(s, "special IPX/SPX processing"); break;
case 0x00F7: strcpy(s, "special IPX/SPX processing"); break;
case 0x00F8: strcpy(s, "IPX in critical section"); break;
case 0x00F9: strcpy(s, "SPX listening"); break;
case 0x00FA: strcpy(s, "processing"); break;
case 0x00FB: strcpy(s, "holding"); break;
case 0x00FC: strcpy(s, "AES waiting"); break;
case 0x00FD: strcpy(s, "AES counting down delay time"); break;
case 0x00FE: strcpy(s, "awaiting packet reception"); break;
case 0x00FF: strcpy(s, "sending packet"); break;
default:
strcpy(s, "unknown ecb state");
}
return (char *)s;
}
char *ipx_get_ecb_cc_string(ipx_ecb_struct far *ecb)
{
static char s[80];
switch(ecb->cc)
{
case 0x0000:
strcpy(s, "success");
break;
case 0x00EC:
strcpy(s, "remote terminated connection without acknowledging packet");
break;
case 0x00ED:
strcpy(s, "abnormal connection termination");
break;
case 0x00EE:
strcpy(s, "invalid connection ID");
break;
case 0x00EF:
strcpy(s, "SPX connection table full");
break;
case 0x00F9:
strcpy(s, "event should not be cancelled");
break;
case 0x00FA:
strcpy(s, "cannot establish connection with specified destination");
break;
case 0x00FC:
strcpy(s, "cancelled");
break;
case 0x00FD:
strcpy(s, "malformed packet");
break;
case 0x00FE:
strcpy(s, "packet undeliverable");
break;
case 0x00FF:
strcpy(s, "physical error or wrong socket");
break;
default:
strcpy(s, "unknown ecb completion code");
}
return (char *)s;
}
ipx_ecb_struct far *ipx_fill_send_ecb(ipx_ecb_struct far *ecb,
ipx_header_struct far *head, void far *data, unsigned short size)
{
if ( head == NULL )
return NULL;
if ( data == NULL )
return NULL;
ecb->head = *head;
ecb->linkaddress = NULL;
ecb->esraddress = NULL;
ecb->inuse = 0; /* In-Use Status */
ecb->cc = 11; /* Completion Flag */
ecb->socket = head->dest.socket; /* destination socket */
ecb->immedaddr[0] = ecb->head.dest.nodeadd[0];
ecb->immedaddr[1] = ecb->head.dest.nodeadd[1];
ecb->immedaddr[2] = ecb->head.dest.nodeadd[2];
ecb->immedaddr[3] = ecb->head.dest.nodeadd[3];
ecb->immedaddr[4] = ecb->head.dest.nodeadd[4];
ecb->immedaddr[5] = ecb->head.dest.nodeadd[5];
ecb->fragcount = 2; /* we always have ipx header and data */
ecb->fragaddr1 = &(ecb->head);
ecb->fragsize1 = (unsigned short)sizeof(ipx_header_struct);
ecb->fragaddr2 = data;
ecb->fragsize2 = size;
return ecb;
}
ipx_ecb_struct far *ipx_get_send_ecb(ipx_header_struct far *head, void far *data, unsigned short size)
{
static ipx_ecb_struct ecb;
return ipx_fill_send_ecb(&ecb, head, data, size);
}
ipx_ecb_struct far *ipx_fill_receive_ecb(ipx_ecb_struct far *ecb,
unsigned short socket, void far *data, unsigned short size)
{
if ( data == NULL )
return NULL;
ecb->linkaddress = NULL;
ecb->esraddress = NULL;
ecb->inuse = 0; /* In-Use Status (available) */
ecb->cc = 0; /* Completion Flag */
ecb->socket = reverse_word(socket);
ecb->fragcount = 2; /* we always have ipx header and data */
ecb->fragaddr1 = &(ecb->head);
ecb->fragsize1 = (unsigned short)sizeof(ipx_header_struct);
ecb->fragaddr2 = data;
ecb->fragsize2 = size;
return ecb;
}
ipx_ecb_struct far *ipx_get_receive_ecb(unsigned short socket, void far *data, unsigned short size)
{
static ipx_ecb_struct ecb;
return ipx_fill_receive_ecb(&ecb, socket, data, size);
}
#ifdef CREATE_MONITOR
#define IPX_MONITOR_SIZE 80
#include <conio.h>
void monitor(unsigned short socket)
{
ipx_ecb_struct far *ecb;
unsigned char data[IPX_MONITOR_SIZE];
if ( ipx_init() == 0 )
{
puts("kein ipx vorhanden");
return;
}
printf("ipx_entry: %lx\n", ipx_entry);
printf("net-adr: %s\n", get_str_net_adr(ipx_get_local_net_number()));
printf("node-adr: %s\n", get_str_node_adr(ipx_get_local_net_number()));
switch(ipx_open_socket(socket))
{
case 0x0fe:
puts("socket table full");
return;
case 0x0ff:
puts("socket open");
return;
}
printf("socket: %d\n", socket);
for(;;)
{
ecb = ipx_get_receive_ecb(socket, (void far *)data, IPX_MONITOR_SIZE);
if ( ecb == NULL )
{
puts("cannot generate ecb");
return;
}
if ( ipx_listen_ecb(ecb) == 0 )
{
puts("cannot listen to ecb");
ipx_close_socket(socket);
return;
}
for(;;)
{
if ( kbhit() != 0 )
break;
if ( ipx_is_ecb_in_use(ecb) == 0 )
{
printf("received packet\n");
printf("inuse: %s \n",
ipx_get_ecb_inuse_string(ecb));
printf("cc: %s\n", ipx_get_ecb_cc_string(ecb));
printf("socket: %d\n", reverse_word(ecb->socket));
printf("dest net-adr: %s\n", get_str_net_adr(&(ecb->head.dest )));
printf("dest node-adr: %s\n", get_str_node_adr(&(ecb->head.dest )));
printf("dest socket: %d\n", reverse_word(ecb->head.dest.socket));
printf("source net-adr: %s\n", get_str_net_adr(&(ecb->head.source)));
printf("source node-adr: %s\n", get_str_node_adr(&(ecb->head.source)));
printf("source socket: %d\n", reverse_word(ecb->head.source.socket));
break;
}
else
{
printf("inuse: %s \r",
ipx_get_ecb_inuse_string(ecb));
}
}
if ( kbhit() != 0 )
{
getch();
break;
}
}
ipx_close_socket(socket);
}
int xmain(void)
{
monitor(2007);
/* monitor(2000); */
return 0;
}
void ymain(void)
{
ipx_ecb_struct far *ecb;
if ( ipx_init() == 0 )
{
puts("kein ipx vorhanden");
return;
}
printf("ipx_entry: %lx\n", ipx_entry);
printf("net-adr: %s\n", get_str_net_adr(ipx_get_local_net_number()));
printf("node-adr: %s\n", get_str_node_adr(ipx_get_local_net_number()));
ecb = ipx_get_send_ecb(ipx_get_header(NULL, 2417, 2419), " ", 2);
printf("<%d,%d>", ecb->inuse, ecb->cc);
ipx_send_ecb(ecb);
printf("<%d,%d>", ecb->inuse, ecb->cc);
while ( ipx_is_ecb_in_use(ecb) != 0 )
{
printf("<%d,%d>", ecb->inuse, ecb->cc);
if ( kbhit() != 0 )
break;
}
printf("<%d,%d>", ecb->inuse, ecb->cc);
}
#endif
#ifdef CREATE_SOCKET_FREE
int main(int argc, char *argv[])
{
if ( argc < 2 )
{
puts("sfree socket-number");
return 1;
}
if ( ipx_init() == 0 )
{
puts("no ipx found");
return 1;
}
printf("close socket %d\n", atoi(argv[1]));
ipx_close_socket((short)atoi(argv[1]));
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -