194 lines
4.3 KiB
Plaintext
194 lines
4.3 KiB
Plaintext
|
'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
|
||
|
|
||
|
|