为了账号安全,请及时绑定邮箱和手机立即绑定

网络游戏登录设计

网络游戏登录设计

Go
慕莱坞森 2021-12-07 18:49:55
我目前正在开发一款在线游戏,但我的login server. 每个玩家只能从一个客户端登录,如果他尝试打开另一个客户端并尝试登录,它应该告诉该帐户已经从另一个客户端登录。这是可行的,但问题是当有人试图在两个客户端同时登录时从 2 个客户端登录,导致帐户在 2 个不同的地方登录。这是我不想要的。我目前的方法是(我使用的是 GoLang):var onLogin map[string]uint16 = make(map[string]uint16)func login(data []byte) []byte {    username := cstring(data[8:23])    password := cstring(data[24:39])    // check if already trying to login    _, loggingIn := onLogin[username]    if loggingIn {        fmt.Println("Possible double connect attempt", username)        return nil    }    (...check if correct login info...)    (...check if user is already logged in...)    // remove from list before returning    delete(onLogin, username)    (...build and send back packet to client if login success or fail...)它有帮助(一点点)但是当有人能够在不人道的同时按下 2 个客户端上的登录按钮时,它仍然会通过。也许我的设计有缺陷?有什么建议吗?干杯!
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

你onLogin需要一个互斥锁,如果你用-race它运行你的代码会告诉你有一场比赛。


Race Detector是必读的。


// 编辑示例:


var onLogin = struct {

    sync.Mutex

    m map[string]bool

}{m: map[string]bool{}}


func login(data []byte) []byte {

    username := cstring(data[8:23])

    password := cstring(data[24:39])

    onLogin.Lock()

    defer onLogin.Unlock()


    if _, loggingIn := onLogin.m[username]; loggingIn {

        fmt.Println("Possible double connect attempt", username)

        return nil

    }

    ///....

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信