我目前正在开发一款在线游戏,但我的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
}
///....
}
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报
0/150
提交
取消