home *** CD-ROM | disk | FTP | other *** search
EPOC OPL Source | 2001-10-25 | 5.4 KB | 207 lines |
-
-
- REM --------------------------------------------------
- REM flfingerd - Sample TCP/IP finger server
- REM Distributed with FlFinger, D Rushall 1999, 2000
- REM Based on Keith Walker's sample echo server for
- REM CSocket OPX
- REM --------------------------------------------------
- REM USE THIS CODE AT YOUR OWN RISK
- REM --------------------------------------------------
- REM Simple program to server 'finger' requests.
- REM
- REM Primarily designed to test and demonstrate my
- REM finger client, 'FlFinger' and may not respond
- REM correctly to all finger requests.
- REM
- REM To use, compile and run, and then use FlFinger
- REM to 'Open connection' to 'someone@localhost',
- REM where 'someone' is any valid user name.
- REM
- REM Could be accessed by other remote finger clients
- REM when EPOC device is connected to network, if you
- REM really wanted to :-)
- REM
- REM Serial implementation - only one request can be
- REM served at a time.
- REM
- REM Edit 'buildReply:' to customise response string.
- REM
- REM See CSocket and CDescriptor OPX documentation for
- REM details of socket interface calls, from:
- REM http://www.starship.freeserve.co.uk/
- REM --------------------------------------------------
-
- DECLARE EXTERNAL
- INCLUDE "CSocket.oxh"
- INCLUDE "CDescriptor.oxh"
-
- CONST KBufferLength% = 1024 : REM max response length
- CONST KFingerPort& = 79 : REM finger service port
-
- EXTERNAL fingerd:
-
- REM -- Main code --
-
- PROC main:
- gBORDER 3
- PRINT "flfingerd - Sample TCP/IP finger server for EPOC"
- PRINT "Distributed with FlFinger, D Rushall 1999, 2000"
- PRINT
- PRINT "USE THIS CODE AT YOUR OWN RISK"
- PRINT "PRESS Ctrl-Esc TO EXIT"
- PRINT
- fingerd:
- PRINT "--END - PRESS ANY KEY" : GET
- ENDP
-
- REM -- Build reply string --
-
- PROC buildReply:(dReply&,query$)
-
- REM Slug to simulate network delay to make things interesting
- PRINT "Needlessly delaying the reponse..."
- PAUSE 50
-
- REM Clear reply buffer
- DesZero:(dReply&)
-
- REM Build a reply, line by line
- DesAppendStr:(dReply&,"Finger response generated by ")
- DesAppendStr:(dReply&,"'flfingerd', a sample TCP/IP finger server for EPOC")
- DesAppendStr:(dReply&,chr$(13)+chr$(10))
- DesAppendStr:(dReply&,"Your finger request was: "+query$)
- DesAppendStr:(dReply&,chr$(13)+chr$(10))
- DesAppendStr:(dReply&,"Customise 'flfingerd.opl' source to place your own message here.")
-
- REM Finish with a new line
- DesAppendStr:(dReply&,chr$(13)+chr$(10))
- ENDP
-
- REM -- Test status code and exit if error --
-
- PROC check:(passed%,str$)
- EXTERNAL server&,socket&,blanksocket&,address&,des&
- IF NOT passed%
- PRINT "--";str$;" FAILED - PRESS ANY KEY"
- GET
- DeleteDes:(des&)
- DeleteSockAddr:(address&)
- DeleteSocket:(socket&)
- DeleteSocket:(blanksocket&)
- DeleteSocketServ:(server&)
- STOP
- ENDIF
- ENDP
-
- REM -- Very simple finger request server --
-
- PROC fingerd:
- GLOBAL server&,socket&,blanksocket&,address&,des&,desa&
- LOCAL err%,status&,loop%,query$(255)
-
- REM Initialise socket server
-
- server& = NewSocketServ&:
- check:(server&<>0,"NewSocketServ")
- err% = SocketServConnect%:(server&,KSockDefaultMessageSlots&)
- check:(err%=0,"SocketServConnect")
-
- REM Create our listener port address
-
- address&=NewInetAddr4&:(KInetAddrLoop&,KFingerPort&)
- check:(address&<>0,"NewInetAddr4")
- PRINT "Listener on",InetAddrOutput$:(address&);":";SockAddrPort&:(address&)
-
- REM Create, open and bind listening socket
-
- socket& = NewSocket&:
- check:(socket&<>0,"NewSocket")
- err% = SocketOpen4%:(socket&,server&,KAfInet&,KSockStream&,KProtocolInetTcp&)
- check:(err%=0,"SocketOpen4")
- err% = SocketBind%:(socket&,address&)
- check:(err%=0,"SocketBind")
- err% = SocketListen%:(socket&,1)
- check:(err%=0,"SocketListen")
-
- REM Create buffer descriptors
-
- des& = NewDesAlloc&:(1)
- check:(des&<>0,"NewDes")
- desa& = NewDesAlloc&:(KBufferLength%)
- check:(des&<>0,"NewDes a")
-
- REM Main finger listener loop
-
- DO
-
- REM Create and open request socket
-
- blanksocket& = NewSocket&:
- check:(blanksocket&<>0,"NewSocket")
- err% = SocketOpen%:(blanksocket&,server&)
- check:(err%=0,"SocketOpen")
-
- REM Wait for and accept client request
-
- PRINT
- PRINT "Waiting for client..."
- SocketAcceptA:(socket&,blanksocket&,status&)
- IOWAITSTAT32 status&
- Check:(status&=0,"SocketAcceptA")
-
- REM Read incomming query string from socket
-
- PRINT "Client connected..."
- query$ = ""
- DO
- DesZero:(des&)
- SocketReadA:(blanksocket&,des&,status&)
- IOWAITSTAT32 status&
- IF status&=0
- check:(status&=0,"SocketRead")
- query$ = query$+DesStr$:(des&)
- ENDIF
- UNTIL status&<>0 or right$(query$,2)=chr$(13)+chr$(10)
- PRINT "Request string is:",query$
-
- REM Build and reply string to client
-
- buildReply:(desa&,query$)
- PRINT "Sending reply..."
- SocketWriteA:(blanksocket&,desa&,status&)
- IOWAITSTAT32 status&
- check:(status&=0,"SocketWrite")
-
- REM Cancel, close and free request socket
-
- SocketCancelAll:(blanksocket&)
- check:(-1,"SocketCancelAll")
- SocketClose:(blanksocket&)
- check:(-1,"SocketClose")
- DeleteSocket:(blanksocket&)
- check:(-1,"DeleteSocket")
-
- REM Loop to get for next request
-
- UNTIL 0 : REM loop indefinitely
-
- REM Cancel and close listening socket
-
- SocketCancelAll:(socket&)
- check:(-1,"SocketCancelAll")
- SocketClose:(socket&)
- check:(-1,"SocketClose")
-
- REM Free resources and done
-
- DeleteDes:(des&)
- DeleteDes:(desa&)
- DeleteInetAddr:(address&)
- DeleteSocket:(socket&)
- DeleteSocketServ:(server&)
- ENDP
-
-
-
-