BCX Console Demonstration Program s128.bas

' --------------------------------------------------------------- 
'   Console utility used to retrieve files from an HTTP server. 
' --------------------------------------------------------------- 
' From the book WinSock 2.0 by Lewis Napper covering programming 
' with sockets.      Adapted to BCX BASIC by Kevin Diggins 
' --------------------------------------------------------------- 
$HEADER
#if defined(__LCC__)
 #include <WINSOCK2.H>
 #endif
$HEADER

$LIBRARY <WSOCK32.LIB> ' LINK WITH WSOCK32.LIB 

#INCLUDE <fcntl.h>

GLOBAL wsaData AS WSADATA
GLOBAL wVersionRequested
GLOBAL nRet

wVersionRequested = MAKEWORD(1,1)

IF ARGC <> 3 THEN
  PRINT "Syntax : GetHTTP ServerName PathAndFileName"
  PRINT "Example: GetHTTP www.yahoo.com index.html"
  END
END IF

nRet = WSAStartup(wVersionRequested, &wsaData)

IF nRet THEN
  PRINT "WSAStartup()", nRet
  WSACleanup()
  END
END IF

IF wsaData.wVersion <> wVersionRequested THEN
  PRINT "WinSock version not supported"
  WSACleanup()
  END
END IF

setmode(_fileno(stdout), _O_BINARY)

GetHTTP(ARGV[1], ARGV[2])

WSACleanup()

SUB GetHTTP (lpServerName$, lpFileName$)
  ' ======================================= 
  DIM LOCAL  nRet
  DIM LOCAL  iaHost       AS IN_ADDR
  DIM LOCAL  lpHostEntry  AS LPHOSTENT
  DIM LOCAL  Socket       AS SOCKET
  DIM LOCAL  lpServEnt    AS LPSERVENT
  DIM LOCAL  saServer     AS SOCKADDR_IN
  DIM LOCAL  szBuffer$
  ' ======================================= 

  iaHost.s_addr = inet_addr(lpServerName)

  IF iaHost.s_addr = INADDR_NONE THEN
    lpHostEntry = gethostbyname(lpServerName$)
  ELSE
    lpHostEntry = gethostbyaddr((CHAR*)&iaHost, SIZEOF(IN_ADDR), AF_INET)
  END IF

  IF lpHostEntry = NULL THEN
    PRINT "Error: HOST NOT FOUND : gethostbyname()"
    END
  END IF

  Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

  IF Socket = INVALID_SOCKET THEN
    PRINT "Error: INVALID_SOCKET : socket ()"
    END
  END IF

  lpServEnt = getservbyname("http", "tcp")

  IF lpServEnt = NULL THEN
    saServer.sin_port = htons(80)
  ELSE
    saServer.sin_port = lpServEnt->s_port
  END IF

  saServer.sin_family = AF_INET
  saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list)
  nRet = connect(Socket, (LPSOCKADDR)&saServer, SIZEOF(SOCKADDR_IN))

  IF nRet = SOCKET_ERROR THEN
    PRINT "Error: SOCKET_ERROR : connect()"
    closesocket(Socket)
    END
  END IF

  szBuffer$ = "GET " & CHR$(13) & CHR$(10) & lpFileName$
  nRet      = send(Socket, szBuffer$, LEN(szBuffer$), 0)

  IF nRet = SOCKET_ERROR THEN
    PRINT "Error: SOCKET_ERROR : send()"
    closesocket(Socket)
    END
  END IF

  WHILE (TRUE)
    nRet = recv(Socket, szBuffer$, SIZEOF(szBuffer$), 0)
    IF nRet = SOCKET_ERROR THEN
      PRINT "Error: SOCKET_ERROR : recv()"
      EXIT LOOP
    END IF
    IF nRet = 0 THEN
      EXIT LOOP
    END IF
    PRINT szBuffer$
  WEND
  closesocket(Socket)
END SUB

Result:

Result not displayed for this example.