WIP: sessions, server, and reading incoming data

Wrote most of the server code that will be needed minus a few parts. Started work on Sessions and the way packets will be parsed and handled.
This commit is contained in:
Justin T 2019-11-27 01:19:31 -06:00
parent b5b15984cc
commit 31682d7af4
2 changed files with 129 additions and 0 deletions

76
habbgo/server/server.go Normal file
View File

@ -0,0 +1,76 @@
package server
import (
"log"
"net"
"os"
"strconv"
)
type server struct {
host string
port uint16
activeSessions []*Session
}
// New returns a pointer to a newly allocated server struct.
func New(port uint16, host string) *server {
server := &server{port: port, host: host}
return server
}
// Start will setup the game server to listen for incoming connections and handle them appropriately.
func (server *server) Start() {
listener, err := net.Listen("tcp", server.host+":"+strconv.Itoa(int(server.port)))
if err != nil {
log.Fatalf("There was an issue starting the game server on port %v.", server.port)
}
log.Printf("Successfully started the game server at %v:%v", server.host, server.port)
defer listener.Close()
// Main loop for handling connections
for {
conn, err := listener.Accept()
if err != nil {
log.Println("Error trying to handle new connection.")
conn.Close()
}
// Check that there aren't multiple sessions for a given IP address
if !(server.sessionsFromSameAddr(conn) >= 1) {
session := &Session{
connection: conn,
server: server,
}
log.Printf("New connection from: %v", conn.LocalAddr().String())
server.activeSessions = append(server.activeSessions, session)
go session.Listen()
} else {
log.Printf("Too many concurrent connections from address %v \n", conn.LocalAddr().String())
conn.Close()
}
}
}
// Stop terminates all active sessions and shuts down the game server.
func (server *server) Stop() {
for _, session := range server.activeSessions {
session.Close()
}
log.Println("Shutting down the game server...")
os.Exit(0)
}
func (server *server) sessionsFromSameAddr(conn net.Conn) int {
count := 0
for _, session := range server.activeSessions {
if conn.LocalAddr().String() == session.connection.LocalAddr().String() {
count++
}
}
return count
}

53
habbgo/server/session.go Normal file
View File

@ -0,0 +1,53 @@
package server
import (
"bufio"
"github.com/jtieri/HabbGo/habbgo/server/protocol/packets"
"log"
"net"
)
type Session struct {
connection net.Conn
buffer bufio.Writer
server *server
}
// Listen starts listening for incoming data from a Session and handles it appropriately.
func (session *Session) Listen() {
reader := bufio.NewReader(session.connection)
// Main loop for listening for incoming packets from a players session
for {
var rawPacket []byte
_, err := reader.Read(rawPacket)
if err != nil {
// TODO handle errors reading packets
}
log.Println(rawPacket) // TODO REMOVE THIS DUMB TEST
// Decode raw rawPacket & if acceptable
if packets.VerifyIncoming(rawPacket) {
// Create an incoming packet struct with remaining bytes in rawPacket
// TODO handle packets coming in from player's Sessions
}
}
}
func (session *Session) Send() {
// Write
// Flush
}
func (session *Session) Queue() {
// Write
}
func (session *Session) Flush() {
// Flush
}
// Close disconnects a Session from the server.
func (session *Session) Close() {
session.connection.Close()
}