98 lines
2.8 KiB
Plaintext
98 lines
2.8 KiB
Plaintext
' This code shows how to make a non-blocking request with
|
|
' timeout to a remote HTTP server to retrieve a webpage
|
|
' and print it on the screen.
|
|
'
|
|
' This requires the BSD Socket Extension installed in Extension
|
|
' Slot 18.
|
|
'
|
|
' Copyright 2023 John Bintz
|
|
' Visit theindustriousrabbit.com for more info
|
|
' Licensed under the MIT License
|
|
|
|
LIB=Socket Library Open
|
|
|
|
If LIB<=0
|
|
Print "Unable to open bsdsocket.library!"
|
|
End
|
|
End If
|
|
|
|
SOCKET=Socket Create Inet Socket
|
|
|
|
' A lot of functions return debugging info. Assign that to
|
|
' some useless variable, unless you're trying to figure out
|
|
' an issue with the extension.
|
|
_=Socket Set Nonblocking(SOCKET,True)
|
|
|
|
HOST$="aminet.net"
|
|
Print "Trying to connect to "+HOST$
|
|
IP$=Dns Get Address By Name$(HOST$)
|
|
|
|
' When nonblocking sockets start to connect, they may or
|
|
' may not finish their connection before the function
|
|
' returns. If the socket doesn't connect, we have to wait
|
|
' for it to do so.
|
|
ALREADY_CONNECTED=Socket Connect(SOCKET To IP$,80)
|
|
|
|
Reserve As Work 30,1024
|
|
|
|
' Due to how AMOS takes over Ctrl-C handing, there's no way
|
|
' for the bsdsocket code to use Exec's Ctrl-C handling.
|
|
' This means we need to poll for network activity.
|
|
' However, the async functions will immediately return
|
|
' if they get appropriate data before the timeout ends.
|
|
' This is somewhat more CPU efficient.
|
|
For I=1 To 100
|
|
If ALREADY_CONNECTED=-1
|
|
' We can check a socket for writing if it's currently
|
|
' attempting to connect. Once it connects, we can stop
|
|
' checking for that status -- we're ready to communicate
|
|
' with the remote server.
|
|
RESULT=Socket Wait Async Writing(SOCKET,100)
|
|
|
|
If RESULT>0
|
|
ALREADY_CONNECTED=0
|
|
End If
|
|
If RESULT=-3
|
|
Print "Unrecoverable error!"
|
|
Exit
|
|
End If
|
|
End If
|
|
|
|
If ALREADY_CONNECTED=0
|
|
Print "Connected to "+HOST$
|
|
|
|
HTTPGET$="GET / HTTP/1.0"+Chr$(10)+"Host: amiga"+Chr$(10)+Chr$(10)
|
|
Print "Making HTTP request to "+HOST$
|
|
_=Socket Send(SOCKET,Varptr(HTTPGET$),Len(HTTPGET$))
|
|
|
|
For J=1 To 100
|
|
RESULT=Socket Wait Async Reading(SOCKET,50)
|
|
|
|
If RESULT>0
|
|
Print "Receiving data"
|
|
' You can receive either to a block of memory...
|
|
'
|
|
'OUT=Socket Recv(SOCKET To Start(30),1024)
|
|
'For K=0 To OUT-1
|
|
' _DATA$=_DATA$+Chr$(Peek(Start(30)+K))
|
|
'Next K
|
|
'
|
|
' ...or to a string...
|
|
_DATA$=Socket Recv$(SOCKET,1024)
|
|
|
|
Print _DATA$
|
|
' If the amount read is less than the length of data,
|
|
' assume we're done. This is fine for HTTP.
|
|
If Len(_DATA$)<1024
|
|
Exit 2
|
|
End If
|
|
End If
|
|
Next J
|
|
Exit
|
|
End If
|
|
Next I
|
|
|
|
Socket Library Close
|
|
|
|
|