John Bintz c14ba040b2 | ||
---|---|---|
src | ||
.gitignore | ||
AMOSPro_BSDSocket.Lib | ||
API.md | ||
HTTP Client Example.amos | ||
LICENSE | ||
README.md | ||
http get v3.amos | ||
the minimum.amos | ||
updated sockaddr in.amos |
README.md
amos-pro-bsdsocket-extension
Want to get online with your AMOS program? Now you can in (some) style!
This extension provides a wrapper around the BSD Socket library provided by your Internet stack. There's some attempt to roll up some of the low-level functionality into something more usable by AMOS.
Installation
- Copy
AMOSPro_BSDSocket.Lib
toAMOSPro_System:APSystem/
- Within AMOS Professional:
-
Config -> Set Interpreter
-
Load Default Configuration
-
Set Loaded Extensions
-
Extension Slot 18 --
AMOSPro_BSDSocket.Lib
-
Exit
-
Save Configuration
-
Restart AMOS Professional
-
Type in the following and Run:
Print Socket Library Open
The line should tokenize, and running it should print -1 if you have no Internet stack running, or a large number if you do.
-
Examples
Communicating with an HTTP server
LIB=Socket Library Open
If LIB<=0
End
End If
SOCKET=Socket Create Inet Socket
_=Socket Set Nonblocking(SOCKET,True)
' connect to aminet.net
IP$=Dns Get Address By Name$("aminet.net")
ALREADY_CONNECTED=Socket Connect(SOCKET To IP$,80)
Reserve As Work 30,1024
For I=1 To 100
If ALREADY_CONNECTED=-1
RESULT=Socket Wait Async Writing(SOCKET,100)
If RESULT>0
ALREADY_CONNECTED=0
End If
End If
If ALREADY_CONNECTED=0
HTTPGET$="GET / HTTP/1.0"+Chr$(10)+"Host: amiga"+Chr$(10)+Chr$(10)
Print "Making HTTP request to aminet.net"
_=Socket Send(SOCKET,Varptr(HTTPGET$),Len(HTTPGET$))
For J=1 To 100
RESULT=Socket Wait Async Reading(SOCKET,5000)
If RESULT>0
OUT=Socket Recv(SOCKET To Start(30),1024)
_DATA$=""
For K=0 To OUT-1
_DATA$=_DATA$+Chr$(Peek(Start(30)+K))
Next K
Print _DATA$
If OUT<1024
Exit 2
End If
End If
Next J
Exit
End If
Next I
Socket Library Close
Starting a server
If Socket Library Open<=0
End
End If
SOCKET=Socket Create Inet Socket
_=Socket Set Nonblocking(SOCKET,True)
_=Socket Reuse Addr(SOCKET)
RESULT=Socket Bind(SOCKET To "INADDR_ANY",8000)
_=Socket Listen(SOCKET)
Print "listening on port 8000"
For I=1 To 100
RESULT=Socket Wait Async Reading(SOCKET,500)
If RESULT>0
_REMOTE_SOCKET=Socket Accept(SOCKET)
Print Socket Inet Ntoa$(Socket Get Host(_REMOTE_SOCKET))
Print Socket Get Port(_REMOTE_SOCKET)
Print Socket Recv$(_REMOTE_SOCKET,1024)
Exit
End If
Wait Vbl
Next I
Socket Library Close
Who's using the extension?
- AQUABYSS
- As of April 2023, the extension's been in heavy use for over a month on the client side of the game.
Doing something cool with the extension? Contact me and I'll add it to the list!
General Notes
- The BSD Socket library, and all sockets, will close automatically when the program runs again. Sockets will stay open after stopping you code so you can debug issues from the AMOS console.
- Since AMOS takes over Ctrl-C handling, you have to continually
poll for socket statuses on nonblocking sockets. Trying to use
a blocking socket will likely cause AMOS to hang indefinitely!
- Using the Wait Async functions with small timeouts are the most system-friendly way of doing this.
- MiamiDX can be fiddly, at least it is on my MiSTer set up. If Internet connectivity is not working, try re-connecting to the network.
Versioning
This project uses semantic versioning.
- If the version number is below 1.0.0, API is not stable.
- If the major number increases, API has changed.
License
Copyright 2023 John Bintz. Licensed under the MIT License.
If you use this in your project, and you really want to, throw a link to theindustriousrabbit.com somewhere.
Feedback? Bug reports?
Go to the About section on The Industrious Rabbit to contact me.
Development
Environment
- Clone the AMOS Professional source code
- Copy the contents of