OPENHOST

From QB64 Wiki
Revision as of 18:01, 10 October 2009 by imported>Clippy
Jump to navigation Jump to search

The _OPENHOST function opens a Host which listens for new connections and returns a Host status handle.



Syntax: host_handle = _OPENHOST("TCP/IP:8080")


  • Creates an ILLEGAL FUNCTION CALL if called with a string argument of the wrong syntax.
  • The port used in the syntax example is 8080.
  • Valid handles are usually negative number values.
  • If the syntax is correct but they fail to begin/connect a handle of 0 is returned. * Always check if the handle returned is 0 (failed) before continuing.
  • CLOSE host_handle closes the host. A failed handle value of 0 does not need to be closed.


Example: Chat program that attempts to connect as a Client. If not it attempts to become the Host.

PRINT "Mini Messenger"
LOCATE , , 1 ' display the print cursor for INKEY$
client = _OPENCLIENT("TCP/IP:7319:localhost") ' Attempt to connect to local host as a client
IF client THEN
PRINT "[connected to " + _CONNECTIONADDRESS(client) + "]"
_TITLE "Client - Mini Messenger"
INPUT "Enter your name: ", myname$
PRINT #client, myname$ + " connected!"
DO
GetMessage client
SendMessage myname$, mymessage$, client ' display current input on screen
_DELAY 0.01 ' reduce CPU usage
LOOP
ELSE ' "if client" alternative to open a new Host
PRINT "[No existing host found]"
host = _OPENHOST("TCP/IP:7319") ' no host found, so begin new host
IF host THEN
_TITLE "Host - Mini Messenger"
PRINT "[Beginning new host chat session!]"
DIM Users(1 to 1000) ' array to hold other client info
numclients = 0
client = _OPENCLIENT("TCP/IP:7319:localhost")
IF client = 0 THEN PRINT "ERROR: could not attach host's personal client to host!"
INPUT "Enter your name:", myname$
PRINT #client, myname$ + " connected!"
PRINT "[Chat session active!]"
DO ' host main loop
newclient = _OPENCONNECTION(host) ' receive any new connection
IF newclient THEN
numclients = numclients + 1
Users(numclients) = newclient
PRINT #Users(numclients),"Welcome!"
END IF
FOR i = 1 TO numclients ' distribute incoming messages to all clients
IF Users(i) THEN
INPUT #Users(i), message$
IF message$ <> "" THEN
FOR p = 1 TO numclients
IF Users(p) THEN PRINT #Users(p), message$
NEXT p
END IF
END IF
NEXT i
GetMessage client ' allow host to get messages and chat also
SendMessage myname$, mymessage$, client
_DELAY 0.01 ' reduce CPU usage
LOOP
END IF ' host
PRINT "ERROR: Could not begin new host!"
END IF ' if client from start
SLEEP
SYSTEM
'.................... END OF MAIN PROGRAM ................


SUB GetMessage (client) ' get & display any new message
INPUT #client, newmessage$
IF newmessage$ <> "" THEN
VIEW PRINT 1 TO 23
LOCATE 23,1
PRINT newmessage$
VIEW PRINT 1 TO 24
END IF
END SUB
SUB SendMessage (myname$, mymessage$, client) ' simple input handler
k$ = INKEY$$
IF LEN(k$) THEN
IF k$ = CHR$(8) AND LEN(mymessage$) <> 0 THEN
mymessage$ = LEFT$(mymessage$, LEN(mymessage$) - 1)
ELSE
IF LEN(k$) = 1 and ASC(k$) >= 32 THEN mymessage$ = mymessage$ + k$
END IF
END IF
LOCATE 24, 1: PRINT SPACE$(80); ' erase previous display
LOCATE 24, 1: PRINT myname$ + ": ";mymessage$;
IF k$ = CHR$(13) THEN ' [Enter] sends the message
IF mymessage$ = "" THEN SYSTEM ' [Enter] with no message ends program
PRINT #client, myname$ + ": " + mymessage$
mymessage$ = ""
END IF
IF k$ = CHR$(27) THEN SYSTEM ' [Esc] key ends program
END SUB


Explanation: The SendMessage SUB program controls the program exit unless both Client and Host fail. Entering no message and hitting [Enter] or pressing the [Esc]] key closes the program. Both SUB programs allow a Client or Host to communicate with others simply. ::INPUT # is used to read messages and PRINT # is used to send messages. The client handle value is used as the port number. Keep in mind that this is just an example. A lot could be added like recording IP addresses!



See also: _OPENCONNECTION, _OPENCLIENT, _CONNECTED, _CONNECTIONADDRESS


Navigation:

Go to Keyword Reference - Alphabetical

Go to Keyword Reference - By usage