############################### # unicrond.icn - the Unicron server daemon # Author: Laurel Cutting # Contributors: Clinton Jeffery, Mike Kemp ############################### procedure main(av) local user, L, net, i, Cmds, buffer, Sockets, Users, port #define user variables port := 4500 Users := [] Sockets := table() buffer := "" #server commands table & methods Cmds := Commands() if av[i := 1 to *av] == ("-port" | "-p") then port := integer(av[i+1]) #open up network to listen for connections until server is shut down net := open(":" || port, "nl") | stop("Open failed: ", sys_errstr(&errno)) write("Virtual Environment Server v0.2 started on port ", port) repeat{ #Check to see which socket is ready for reading if *Users = 0 then L := select(net,0) else L := select(net, Users, 0) #Make new conncetion if listener ready & user is ready to login if !L === net then{ buffer := read(net) #see if command is valid and a login request if Cmds.IsCommand(buffer) then { if Cmds.GetCommand(buffer) === "login" then{ user := User(Cmds.GetMessage(buffer, 8)) #Put user in socket table Sockets[net] := user #Put user socket in User List put(Users,net) write(net, "\\say Connection made. There are ", *Users, " online at this time.") } else { write(net, "\\say Connection not made, client login error") close(net) } } else { write(net, "\\say Connection Not Made, Not valid command") close(net) } #create net listener socket net := open(":" || port, "nl") | stop("Open failed: ", sys_errstr(&errno)) write("There are ", *Users, " online\n", "Sockets: ", *Sockets) buffer := "" } #Read from Users ready to write else{ every i := 1 to *L do { #interpret and use command if buffer := read(L[i]) then Cmds.ExecuteCommand(L, Sockets, Users, buffer, i) #user has disconnected, remove from user list and close connection else { Cmds.DeleteUser(L, Sockets, Users, i) } } } } close(net) end