############################### # 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) write("The time is: ", &dateline) repeat { #Check to see which socket is ready for reading if *Users = 0 then { L := select(net) } else { L := select(net, Users) } # Make new connection 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 ", &dateline) } else { write(net, "\\say Connection not made, client login error, ", &dateline) close(net) } } else { write(net, "\\say Connection Not Made, invalid command, ", &dateline) 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