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.