Get ready for video release
This commit is contained in:
parent
51748aa5f8
commit
2fa36319e9
|
@ -0,0 +1,20 @@
|
|||
# Amiga BSD Socket coding
|
||||
|
||||
Get your Amiga doing stuff on the Internet!
|
||||
|
||||
All code in this repo is licensed under the MIT License.
|
||||
|
||||
## The original AMOS code
|
||||
|
||||
`amos_pro_original` contains the original AMOS Professional code to use
|
||||
`bsdsocket.library` in BASIC. It requires the
|
||||
[EasyLife](http://aminet.net/package/dev/amos/Easylife110_P1) extension.
|
||||
|
||||
This is the code used in the [23 Year Old Code](https://youtu.be/l4GNHJfYOUU) video.
|
||||
|
||||
## Server in C
|
||||
|
||||
`server_in_c` uses SAS/C and the AmiTCK SDK to build a simple server that
|
||||
prints out what is received, like a very basic `netcat`.
|
||||
|
||||
This is the code used in the [Simple Server in C for the Commodore Amiga]() video.
|
Binary file not shown.
|
@ -0,0 +1,121 @@
|
|||
Short: Use bsdsocket.library calls in AmosPro
|
||||
Uploader: John Bintz (hello@theindustriousrabbit.com)
|
||||
Author: John Bintz (hello@theindustriousrabbit.com)
|
||||
Type: dev/amos
|
||||
|
||||
These procedures directly call bsdsocket.library, the TCP library created by
|
||||
your Internet Dialer (Miami, AmiTCP, TermiteTCP). They are much faster and more
|
||||
friendly than the TCP: device equivalents, as they allow transfers to be
|
||||
Non-Blocking. Normally, with TCP:, if there was no data to get, TCP: would lock
|
||||
until it got some. Now, the program will simply ignore lack of data and move
|
||||
on.
|
||||
|
||||
You need a lot of memory to run a Stack and Amos at the same time. I would say
|
||||
three or four meg would do it, depending on what else you have running.
|
||||
|
||||
The EasyLife extension is required.
|
||||
|
||||
Licensed under the MIT license.
|
||||
|
||||
Commands (port 80 is http):
|
||||
|
||||
BSD_OPEN
|
||||
Open the bsdsocket.library
|
||||
BSD_CLOSE
|
||||
Close the bsdsocket.library and all sockets attached
|
||||
SOCK_OPENCONNECTION[HOST$,SPORT]
|
||||
Open a connection to a computer in the fashion tcp://HOST$:SPORT/
|
||||
Returns Socket ID
|
||||
Example: SOCK_OPENCONNECTION["www.yahoo.com",80]
|
||||
SOCK_OPENSERVER[SPORT]
|
||||
Create a server port on your computer
|
||||
Returns Socket ID
|
||||
Example: SOCK_OPENSERVER[80]
|
||||
SOCK_CHECKHOSTPORT[SOCKET]
|
||||
Check Host Socket for a connection
|
||||
Returns Connected Socket ID (use this for transfers) or -1
|
||||
Example: SOCK_CHECKHOSTPORT[MYPORT]
|
||||
SOCK_GETYOURHOST
|
||||
Returns your host computer's name
|
||||
Example: SOCK_GETYOURHOST : Print Param$
|
||||
"as1s23-wmn.erols.com"
|
||||
SOCK_SENDSTRING[SOCKET,A$]
|
||||
SOCK_READSTRING[SOCKET,MXSIZE]
|
||||
Writes and reads strings over a socket
|
||||
SENDSTRING returns characters sent
|
||||
READSTRING returns string received
|
||||
SOCK_SEND[SOCKET,ADR,LEN]
|
||||
SOCK_READ[SOCKET,ADR,LEN]
|
||||
Send and receive large chunks of data over a socket
|
||||
Both return numbers of characters sent/received
|
||||
SOCK_CLOSE[SOCKET]
|
||||
Close a socket and save some memory
|
||||
SOCK_ERR[VARADDR]
|
||||
Set a certain 4-byte memory address to receive TCP errors
|
||||
SOCK_NEW
|
||||
Create a new socket
|
||||
Returns socket ID of new socket
|
||||
SOCK_SETIO[SOCKET]
|
||||
Set Non-Blocking, Asynchronous IO on a Socket
|
||||
|
||||
There are also a collection of commands especially for working with FTP, as it
|
||||
uses a crazy system of ports and data links. I decided to save youall the
|
||||
trouble of figuring out FTP. Grab the RFC for FTP. With these commands, you'll
|
||||
have it all figured out.
|
||||
|
||||
FTP_OPENCONNECTION[HOST$,SPORT]
|
||||
Open an FTP connection (ftp://HOST$:SPORT/)
|
||||
FTP_HOSTSOCK
|
||||
Returns Socket ID of Host machine (where to send FTP commands)
|
||||
FTP_YOURSOCK
|
||||
Returns your Socket ID for transfers (where to check for files)
|
||||
FTP_YOURPORT$
|
||||
Returns the PORT string to use
|
||||
FTP_CLOSECONNECTION
|
||||
Close FTP connections
|
||||
|
||||
'A Sample TCP/FTP Session
|
||||
'All the major commands are used in here
|
||||
|
||||
(FTP port is 23)
|
||||
|
||||
FTP_OPENCONNECTION["ftp.wustl.edu",23]
|
||||
Proc FTP_HOSTSOCK : HOSTSOCK=Param
|
||||
Proc FTP_YOURSOCK : YOURSOCK=Param
|
||||
Proc FTP_YOURPORT$ : YOURPORT$=Param$
|
||||
|
||||
E$=Chr$(13)+Chr$(10)
|
||||
|
||||
SOCK_SENDSTRING[HOSTSOCK,"USER anonymous"+E$]
|
||||
SOCK_SENDSTRING[HOSTSOCK,"PASS uv334@victoria.tc.ca"+E$]
|
||||
Repeat
|
||||
SOCK_READSTRING[HOSTSOCK,256]
|
||||
Print Param$
|
||||
Until Param$=""
|
||||
|
||||
SOCK_SENDSTRING[HOSTSOCK,"CD /pub/aminet/game/rpg/"+E$]
|
||||
SOCK_SENDSTRING[HOSTSOCK,YOURPORT$]
|
||||
Repeat
|
||||
SOCK_READSTRING[HOSTSOCK,256]
|
||||
Print Param$
|
||||
Until Param$=""
|
||||
|
||||
SOCK_SENDSTRING[HOSTSOCK,"GET FinalExistence.lha"] : Rem Shameless, aren't I?
|
||||
CONN=-1
|
||||
Repeat
|
||||
SOCK_CHECKHOSTPORT[YOURSOCK]
|
||||
If Param>-1
|
||||
CONN=Param
|
||||
Reserve As Work 23,2048
|
||||
Open Out 1,"FinalExistence.lha"
|
||||
Repeat
|
||||
SOCK_READ[CONN,Start(23),2048] : BYTES=Param
|
||||
If BYTES>-1
|
||||
Ssave 1,Start(23) to Start(23)+BYTES-1
|
||||
End If
|
||||
Until BYTES=-1
|
||||
End If
|
||||
Until CONN>-1
|
||||
SOCK_CLOSE[CONN]
|
||||
|
||||
FTP_CLOSECONNECTION
|
|
@ -0,0 +1,193 @@
|
|||
'BSDSocket.library Procedures
|
||||
'By John Bintz
|
||||
'
|
||||
'Licensed under the MIT License
|
||||
'Extension 16 is the EasyLife extension
|
||||
|
||||
'Open bsdsocket.library
|
||||
Procedure BSD_OPEN
|
||||
Lib Open 5,"bsdsocket.library",0
|
||||
End Proc
|
||||
'Close bsdsocket.library
|
||||
Procedure BSD_CLOSE
|
||||
Lib Close 5
|
||||
End Proc
|
||||
|
||||
'Create New Socket
|
||||
Procedure SOCK_NEW
|
||||
Dreg(0)=2
|
||||
Dreg(1)=1
|
||||
Dreg(2)=0
|
||||
WHICH=Lib Call(5,-$1E)
|
||||
End Proc[WHICH]
|
||||
'Set Memory Address to Place Errors
|
||||
Procedure SOCK_ERR[VARADDR]
|
||||
Areg(0)=VARADDR
|
||||
Dreg(0)=4
|
||||
SUCCESS=Lib Call(5,-$A8)
|
||||
End Proc
|
||||
|
||||
'Open A Server Socket on Your Machine at PORT (mymachine.com:PORT)
|
||||
Procedure SOCK_OPENSERVER[SPORT]
|
||||
Proc SOCK_NEW : SOCKET=Param
|
||||
|
||||
SOCK_GETYOURHOST
|
||||
A$=Param$+Chr$(0)
|
||||
Areg(0)=Varptr(A$)
|
||||
|
||||
HOSTINFO=Lib Call(5,-$D2)
|
||||
HOSTADDRESS=Leek(Leek(Leek(HOSTINFO+16)))
|
||||
|
||||
A$=Chr$(16)+Chr$(2)+ Extension_16_04EA(SPORT)+ Extension_16_04CE(HOSTADDRESS)+String$(Chr$(0),8)
|
||||
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=Varptr(A$)
|
||||
Dreg(1)=Len(A$)
|
||||
BIND=Lib Call(5,-$24)
|
||||
|
||||
Dreg(0)=SOCKET
|
||||
Dreg(1)=1
|
||||
LISTEN=Lib Call(5,-$2A)
|
||||
SOCK_SETIO[SOCKET]
|
||||
If BIND=-1
|
||||
SOCK_CLOSE[SOCKET]
|
||||
SOCKET=-1
|
||||
End If
|
||||
End Proc[SOCKET]
|
||||
'Set Non-Blocking/Asynchronous IO
|
||||
Procedure SOCK_SETIO[SOCKET]
|
||||
IOC_FIONBIO=($80000000 or(4*65536) or 126 or(Asc("f")*256))
|
||||
IOC_FIOASYNC=($80000000 or(4*65536) or 125 or(Asc("f")*256))
|
||||
|
||||
NBIO=1
|
||||
Dreg(0)=SOCKET : Dreg(1)=IOC_FIONBIO : Areg(0)=Varptr(NBIO)
|
||||
NOBLOCK=Lib Call(5,-$72)
|
||||
NBIO=1
|
||||
Dreg(0)=SOCKET : Dreg(1)=IOC_FIOASYNC : Areg(0)=Varptr(NBIO)
|
||||
NOBLOCK=Lib Call(5,-$72)
|
||||
End Proc
|
||||
'Connect to Another Computer (tcp://HOST$:SPORT/)
|
||||
Procedure SOCK_OPENCONNECTION[HOST$,SPORT]
|
||||
Proc SOCK_NEW : SOCKET=Param
|
||||
A$=HOST$+Chr$(0)
|
||||
Areg(0)=Varptr(A$)
|
||||
|
||||
HOSTINFO=Lib Call(5,-$D2)
|
||||
HOSTADDRESS=Leek(Leek(Leek(HOSTINFO+16)))
|
||||
A$=Chr$(16)+Chr$(2)+ Extension_16_04EA(SPORT)+ Extension_16_04CE(HOSTADDRESS)+String$(Chr$(0),8)
|
||||
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=Varptr(A$)
|
||||
Dreg(1)=Len(A$)
|
||||
CONNECT=Lib Call(5,-$36)
|
||||
SOCK_SETIO[SOCKET]
|
||||
If CONNECT=-1
|
||||
SOCK_CLOSE[SOCKET]
|
||||
SOCKET=-1
|
||||
End If
|
||||
End Proc[SOCKET]
|
||||
'Check Your Host Port for Connection and Create A New Socket If So
|
||||
Procedure SOCK_CHECKHOSTPORT[SOCKET]
|
||||
A$=String$(Chr$(0),200)
|
||||
FINSIZE=64
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=Varptr(A$)
|
||||
Areg(1)=Varptr(FINSIZE)
|
||||
NEWSOCKET=Lib Call(5,-$30)
|
||||
SOCK_CONNURL= Extension_16_04DC(Mid$(A$,8,4))
|
||||
End Proc[NEWSOCKET]
|
||||
|
||||
'Send A String to a Socket
|
||||
Procedure SOCK_SENDSTRING[SOCKET,A$]
|
||||
If SOCKET<>-1
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=Varptr(A$)
|
||||
Dreg(1)=Len(A$)
|
||||
Dreg(2)=0
|
||||
NBYTES=Lib Call(5,-$42)
|
||||
End If
|
||||
End Proc[NBYTES]
|
||||
'Read A String from a Socket
|
||||
Procedure SOCK_READSTRING[SOCKET,MXSIZE]
|
||||
If SOCKET<>-1
|
||||
A$=Space$(MXSIZE)
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=Varptr(A$)
|
||||
Dreg(1)=MXSIZE
|
||||
Dreg(2)=0
|
||||
NBYTES=Lib Call(5,-$4E)
|
||||
If NBYTES>0
|
||||
A$=Left$(A$,NBYTES)
|
||||
Else
|
||||
A$=""
|
||||
End If
|
||||
Else
|
||||
A$=""
|
||||
End If
|
||||
End Proc[A$]
|
||||
'Send A Memory Buffer to a Socket
|
||||
Procedure SOCK_SEND[SOCKET,ADR,ADRLEN]
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=ADR
|
||||
Dreg(1)=ADRLEN
|
||||
Dreg(2)=0
|
||||
NBYTES=Lib Call(5,-$42)
|
||||
End Proc[NBYTES]
|
||||
'Read A Memory Buffer from a Socket
|
||||
Procedure SOCK_READ[SOCKET,ADR,ADRLEN]
|
||||
Dreg(0)=SOCKET
|
||||
Areg(0)=ADR
|
||||
Dreg(1)=ADRLEN
|
||||
Dreg(2)=0
|
||||
NBYTES=Lib Call(5,-$4E)
|
||||
End Proc[NBYTES]
|
||||
|
||||
'Get Your Hostname (PPP)
|
||||
Procedure SOCK_GETYOURHOST
|
||||
Open In 1,"env:hostname"
|
||||
A$=Input$(1,Lof(1)) : Close 1
|
||||
End Proc[A$]
|
||||
|
||||
'Close A Socket (Save Memory)
|
||||
Procedure SOCK_CLOSE[SOCKET]
|
||||
If SOCKET<>-1
|
||||
Dreg(0)=SOCKET
|
||||
SUCCESS=Lib Call(5,-$78)
|
||||
Print SUCCESS,SOCK_ERRNO
|
||||
End If
|
||||
End Proc
|
||||
|
||||
'These Commands are especially for FTP, which is weird...
|
||||
|
||||
'Open An FTP Connection (ftp://HOST$:SPORT/)
|
||||
Procedure FTP_OPENCONNECTION[HOST$,SPORT]
|
||||
Shared _FTP_HOSTSOCK,_FTP_YOURSOCK,_FTP_YOURPORT$
|
||||
SOCK_OPENCONNECTION[HOST$,SPORT] : _FTP_HOSTSOCK=Param
|
||||
SOCK_OPENSERVER[5000] : _FTP_YOURSOCK=Param
|
||||
P$="" : H$=Mid$(Hex$(HOSTADDRESS,8),2)
|
||||
For I=0 To 3
|
||||
P$=P$+Str$(Val("$"+Mid$(H$,I*2+1,2)))+","
|
||||
Next
|
||||
P$=P$-" "
|
||||
_FTP_YOURPORT$="PORT "+P$+"19,136"+Chr$(13)+Chr$(10)
|
||||
End Proc
|
||||
'Grab Host Socket ID
|
||||
Procedure FTP_HOSTSOCK
|
||||
Shared _FTP_HOSTSOCK
|
||||
End Proc[_FTP_HOSTSOCK]
|
||||
'Grab Your Socket ID
|
||||
Procedure FTP_YOURSOCK
|
||||
Shared _FTP_YOURSOCK
|
||||
End Proc[_FTP_YOURSOCK]
|
||||
'Grab PORT String (used to send files via FTP)
|
||||
Procedure FTP_YOURPORT$
|
||||
Shared _FTP_YOURPORT$
|
||||
End Proc[_FTP_YOURPORT$]
|
||||
'Close an FTP Connection
|
||||
Procedure FTP_CLOSECONNECTION
|
||||
Shared _FTP_HOSTSOCK,_FTP_YOURSOCK
|
||||
SOCK_CLOSE[_FTP_HOSTSOCK]
|
||||
SOCK_CLOSE[_FTP_YOURSOCK]
|
||||
End Proc
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# Amiga BSD Socket Server in C
|
||||
|
||||
Built using SAS/C 6.58 and the
|
||||
[AmiTCP 4.3 SDK](http://aminet.net/package/comm/tcp/AmiTCP-SDK-4.3).
|
||||
|
||||
## Socket test code
|
||||
|
||||
If you can build and run `test_setup.c`, your NDK setup is correct:
|
||||
|
||||
`sc link test_setup.c`
|
||||
|
||||
## Server
|
||||
|
||||
Build it without the `chkabort` routine:
|
||||
|
||||
`sc link nochkabort server.c`
|
Binary file not shown.
|
@ -89,8 +89,6 @@ void teardown(void) {
|
|||
// SHUT_RDWR, stop all communication both ways
|
||||
2
|
||||
);
|
||||
// double close it to stop the listen as well
|
||||
CloseSocket(serverSocket);
|
||||
CloseSocket(serverSocket);
|
||||
}
|
||||
|
||||
|
@ -136,7 +134,7 @@ void readData(int clientSocket) {
|
|||
printf("Got stuff: %i\n", msgSize);
|
||||
printf("%s\n", buffer);
|
||||
}
|
||||
} while (msgSize == BUFFER_LENGTH);
|
||||
} while (msgSize == 256);
|
||||
printf("Data received: %s\n", buffer);
|
||||
}
|
||||
|
||||
|
@ -166,7 +164,7 @@ int main(void) {
|
|||
|
||||
// just enough to get WaitSelect working
|
||||
// this macro also wants strings.h included
|
||||
FD_ZERO(&readFDs); ((
|
||||
FD_ZERO(&readFDs);
|
||||
FD_SET(serverSocket, &readFDs);
|
||||
waitSelectResult = WaitSelect(
|
||||
serverSocket + 1,
|
|
@ -0,0 +1,21 @@
|
|||
#include <proto/exec.h>
|
||||
#include <dos/dos.h>
|
||||
#include <proto/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
int main(void) {
|
||||
if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
|
||||
printf("Can't open socket library\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (serverSocket < 0) {
|
||||
printf("can't get a socket\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
CloseSocket(serverSocket);
|
||||
CloseLibrary(SocketBase);
|
||||
}
|
Loading…
Reference in New Issue