From 2fa36319e9e485f4f8030decf41ac231b6f7f857 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Wed, 11 Jan 2023 08:03:46 -0500 Subject: [PATCH] Get ready for video release --- README.md | 20 +++ amos_pro_original/BSDSocket.amos | Bin 0 -> 6648 bytes amos_pro_original/BSDSocket.readme | 121 ++++++++++++++++++ amos_pro_original/BSDSocket.txt | 193 +++++++++++++++++++++++++++++ server_in_c/README.md | 16 +++ SCOPTIONS => server_in_c/SCOPTIONS | 0 server_in_c/server | Bin 0 -> 8052 bytes server.c => server_in_c/server.c | 6 +- server_in_c/test_setup.c | 21 ++++ 9 files changed, 373 insertions(+), 4 deletions(-) create mode 100644 README.md create mode 100644 amos_pro_original/BSDSocket.amos create mode 100644 amos_pro_original/BSDSocket.readme create mode 100644 amos_pro_original/BSDSocket.txt create mode 100644 server_in_c/README.md rename SCOPTIONS => server_in_c/SCOPTIONS (100%) create mode 100755 server_in_c/server rename server.c => server_in_c/server.c (96%) create mode 100644 server_in_c/test_setup.c diff --git a/README.md b/README.md new file mode 100644 index 0000000..cfae9ef --- /dev/null +++ b/README.md @@ -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. diff --git a/amos_pro_original/BSDSocket.amos b/amos_pro_original/BSDSocket.amos new file mode 100644 index 0000000000000000000000000000000000000000..56a354abf1b70770f4c1d02a7a2032b920b6cfa3 GIT binary patch literal 6648 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 KTxqXjO8!5g$nd)W literal 0 HcmV?d00001 diff --git a/amos_pro_original/BSDSocket.readme b/amos_pro_original/BSDSocket.readme new file mode 100644 index 0000000..03796c9 --- /dev/null +++ b/amos_pro_original/BSDSocket.readme @@ -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 diff --git a/amos_pro_original/BSDSocket.txt b/amos_pro_original/BSDSocket.txt new file mode 100644 index 0000000..0118925 --- /dev/null +++ b/amos_pro_original/BSDSocket.txt @@ -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 + + diff --git a/server_in_c/README.md b/server_in_c/README.md new file mode 100644 index 0000000..58c0eb5 --- /dev/null +++ b/server_in_c/README.md @@ -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` diff --git a/SCOPTIONS b/server_in_c/SCOPTIONS similarity index 100% rename from SCOPTIONS rename to server_in_c/SCOPTIONS diff --git a/server_in_c/server b/server_in_c/server new file mode 100755 index 0000000000000000000000000000000000000000..51ad02e62e72c567645676afe10c74e2e8d90fdd GIT binary patch literal 8052 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 +#include +#include +#include +#include + +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); +}