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

📄 ipx.c

📁 一个使用IPX协议在两台机器间传送文件的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   }
   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 + -