[comp.dcom.lans] NBRCV.C

TRADER@cup.portal.com (09/27/88)

/* NBRCV.C -  sample program - receives NetBIOS broadcast. -          */
/* Paul McGinnis - AST Research, Data Comm Support - Dept. 430        */
/* August 1988. - comments added 9/26/88                              */
/*								      */
/* General calling sequence for NetBIOS calls:                        */
/* 1. Set up NCB (Network Control Block)                              */
/* 2. Make ES:BX point to NCB structure                               */
/* 3. Load AX with 100h                                               */
/* 4. Generate an INT 5Ch                                             */
/* 								      */
/* NetBIOS commands and definitions in NETBIOS.H                      */
/*								      */
/* Compilation information:                                           */
/* Compiler: Borland Turbo C v1.5                                     */
/* Memory model: Small                                                */
/* Floating point support: none                                       */


#include <dos.h>
#include <stdio.h>
#include <netbios.h>
#include <stdlib.h>
#include <string.h>


main()
{
  NCB far * rcv_block;
  char far * rcv_message;
  char far * session_name;
  unsigned char ret_code, net_num, iflag;
  rcv_block = (NCB far *) malloc(sizeof(NCB));
  rcv_message = (char far *) malloc(80);
  session_name = (char far *) malloc(16);
  _AH = 0;
  geninterrupt(0x2a);   /* Check to see if NetBIOS is loaded */
  iflag = _AH;
  if (!iflag)
  {
    puts("    *** ERROR - NetBIOS not installed. ***");
    return;
  }
  printf("Enter session name: ");
  gets(session_name);
  puts("generating network name...");
  rcv_block -> NCB_COMMAND = ADD_NAME_WAIT;   /* Use default time-out values */
  rcv_block -> NCB_LANA_NUM = 0;
  rcv_block -> NCB_STO = 0;
  rcv_block -> NCB_RTO = 0;
  strncpy(rcv_block -> NCB_NAME, session_name, 16);  /* Copy name to NCB   */
  strncpy(rcv_block -> NCB_CALLNAME, "*", 16);  /* Check all names on net  */
  _ES = FP_SEG(rcv_block);
  _BX = FP_OFF(rcv_block);
  _AX = 0x100;
  geninterrupt(0x5c);
  ret_code = _AL;
  net_num = rcv_block -> NCB_NUM;
  if (ret_code)
  {
    printf("Bad return code = %02Xh\n", ret_code);
    return;
  }
  printf("Session established. Name number = %02Xh\n", net_num);
  puts("Waiting for broadcast message...");
  rcv_block -> NCB_RTO = 0;
  rcv_block -> NCB_BUFFER_OFFSET = FP_OFF(rcv_message);
  rcv_block -> NCB_BUFFER_SEGMENT = FP_SEG(rcv_message);
  rcv_block -> NCB_LENGTH = 80;
  rcv_block -> NCB_COMMAND = RECEIVE_BCST_DATAGRAM_WAIT; /* Wait until rcvd. */
  _ES = FP_SEG(rcv_block);
  _BX = FP_OFF(rcv_block);
  _AX = 0x100;
  geninterrupt(0x5c);
  ret_code = _AL;
  pokeb(FP_SEG(rcv_message), FP_OFF(rcv_message) + rcv_block -> NCB_LENGTH, 0);
  if (ret_code)
    printf("Error number = %02Xh\n", ret_code);
  else
  {
    printf("%c*** %Fs\n", 7, rcv_message);
    printf("From: %Fs\n", rcv_block -> NCB_CALLNAME);
  }
  printf("Releasing session >>>%Fs<<<, number %02Xh\n",
    rcv_block -> NCB_NAME, net_num);
  rcv_block -> NCB_NUM = net_num;
  rcv_block -> NCB_COMMAND = DELETE_NAME_WAIT; /* Schedule name for removal */
  _ES = FP_SEG(rcv_block);
  _BX = FP_OFF(rcv_block);
  _AX = 0x100;
  geninterrupt(0x5c);
  ret_code = _AL;
  if (ret_code)
    printf("Error number = %02Xh.\n", ret_code);
  else
    puts("Completed normally.");
}