diff --git a/cmd/server/conns.go b/cmd/server/conns.go new file mode 100644 index 0000000..43d6358 --- /dev/null +++ b/cmd/server/conns.go @@ -0,0 +1,46 @@ +package main + +import ( + "log" + "net" + "sync" +) + +var ( + connCenter ConnCenter +) + +type ConnCenter struct { + Conns map[uint16]net.Conn + Mu sync.Mutex +} + +func (c *ConnCenter) Init() { + c.Conns = make(map[uint16]net.Conn) +} + +func (c *ConnCenter) AddConn(id uint16, con net.Conn) (uint16, error) { + c.Mu.Lock() + defer c.Mu.Unlock() + log.Printf("Conns: add %v with %d id\n", con, id) + c.Conns[id] = con + return id, nil +} + +func (c *ConnCenter) DeleteIfHaveOne(id uint16) { + name, found := c.Conns[id] + if !found { + log.Printf("Conn with %d id is not found; Can not delete\n", id) + return + } + delete(c.Conns, id) + log.Printf("Conn with %v con and %d id was found; Conn is deleted\n", name, id) +} + +func (c *ConnCenter) GetConn(id uint16) (net.Conn, error) { + con, have := c.Conns[id] + if !have { + return nil, ERROR_DONT_HAVE + } + return con, nil +} diff --git a/cmd/server/main.go b/cmd/server/main.go index dbf5cb7..8260c67 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -16,6 +16,7 @@ import ( func main() { userCenter.Init() linkCenter.Init() + connCenter.Init() host, err := env.GetHost() if err != nil { log.Fatal(err) @@ -109,6 +110,7 @@ func handleClient(conn net.Conn) { conn.Write(answ) isRegistered = true registeredID = id + connCenter.AddConn(id, conn) } case com.ID_CLIENT_SEND_SERVER_LINK: l, err := com.DecodeLink(msg.Data) @@ -164,5 +166,6 @@ func handleClient(conn net.Conn) { if isRegistered { userCenter.DeleteIfHaveOne(registeredID) linkCenter.CleanAfterLeave(registeredID) + connCenter.DeleteIfHaveOne(registeredID) } }