2021-12-12 11:48:01 +08:00
|
|
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
|
|
|
|
|
|
|
|
package nodes
|
|
|
|
|
|
2022-08-26 16:47:42 +08:00
|
|
|
import (
|
|
|
|
|
"crypto/tls"
|
|
|
|
|
"net"
|
|
|
|
|
)
|
2021-12-12 11:48:01 +08:00
|
|
|
|
|
|
|
|
type BaseClientConn struct {
|
|
|
|
|
rawConn net.Conn
|
|
|
|
|
|
|
|
|
|
isBound bool
|
2022-07-07 09:21:18 +08:00
|
|
|
userId int64
|
2021-12-12 11:48:01 +08:00
|
|
|
serverId int64
|
|
|
|
|
remoteAddr string
|
2022-07-15 11:15:55 +08:00
|
|
|
hasLimit bool
|
2021-12-12 11:48:01 +08:00
|
|
|
|
|
|
|
|
isClosed bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *BaseClientConn) IsClosed() bool {
|
|
|
|
|
return this.isClosed
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsBound 是否已绑定服务
|
|
|
|
|
func (this *BaseClientConn) IsBound() bool {
|
|
|
|
|
return this.isBound
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Bind 绑定服务
|
|
|
|
|
func (this *BaseClientConn) Bind(serverId int64, remoteAddr string, maxConnsPerServer int, maxConnsPerIP int) bool {
|
|
|
|
|
if this.isBound {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
this.isBound = true
|
|
|
|
|
this.serverId = serverId
|
|
|
|
|
this.remoteAddr = remoteAddr
|
2022-07-15 11:15:55 +08:00
|
|
|
this.hasLimit = true
|
2021-12-12 11:48:01 +08:00
|
|
|
|
|
|
|
|
// 检查是否可以连接
|
|
|
|
|
return sharedClientConnLimiter.Add(this.rawConn.RemoteAddr().String(), serverId, remoteAddr, maxConnsPerServer, maxConnsPerIP)
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-05 20:37:00 +08:00
|
|
|
// SetServerId 设置服务ID
|
|
|
|
|
func (this *BaseClientConn) SetServerId(serverId int64) {
|
|
|
|
|
this.serverId = serverId
|
2022-08-26 16:47:42 +08:00
|
|
|
|
|
|
|
|
// 设置包装前连接
|
|
|
|
|
switch conn := this.rawConn.(type) {
|
|
|
|
|
case *tls.Conn:
|
|
|
|
|
nativeConn, ok := conn.NetConn().(ClientConnInterface)
|
|
|
|
|
if ok {
|
|
|
|
|
nativeConn.SetServerId(serverId)
|
|
|
|
|
}
|
|
|
|
|
case *ClientConn:
|
|
|
|
|
conn.SetServerId(serverId)
|
|
|
|
|
}
|
2022-07-05 20:37:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ServerId 读取当前连接绑定的服务ID
|
|
|
|
|
func (this *BaseClientConn) ServerId() int64 {
|
|
|
|
|
return this.serverId
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-07 09:21:18 +08:00
|
|
|
// SetUserId 设置所属服务的用户ID
|
|
|
|
|
func (this *BaseClientConn) SetUserId(userId int64) {
|
|
|
|
|
this.userId = userId
|
2022-08-26 16:47:42 +08:00
|
|
|
|
|
|
|
|
// 设置包装前连接
|
|
|
|
|
switch conn := this.rawConn.(type) {
|
|
|
|
|
case *tls.Conn:
|
|
|
|
|
nativeConn, ok := conn.NetConn().(ClientConnInterface)
|
|
|
|
|
if ok {
|
|
|
|
|
nativeConn.SetUserId(userId)
|
|
|
|
|
}
|
|
|
|
|
case *ClientConn:
|
|
|
|
|
conn.SetUserId(userId)
|
|
|
|
|
}
|
2022-07-07 09:21:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// UserId 获取当前连接所属服务的用户ID
|
|
|
|
|
func (this *BaseClientConn) UserId() int64 {
|
|
|
|
|
return this.userId
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-10 19:54:10 +08:00
|
|
|
// RawIP 原本IP
|
|
|
|
|
func (this *BaseClientConn) RawIP() string {
|
|
|
|
|
ip, _, _ := net.SplitHostPort(this.rawConn.RemoteAddr().String())
|
|
|
|
|
return ip
|
|
|
|
|
}
|
2022-01-13 11:36:05 +08:00
|
|
|
|
|
|
|
|
// TCPConn 转换为TCPConn
|
2022-08-26 16:47:42 +08:00
|
|
|
func (this *BaseClientConn) TCPConn() (tcpConn *net.TCPConn, ok bool) {
|
|
|
|
|
// 设置包装前连接
|
|
|
|
|
switch conn := this.rawConn.(type) {
|
|
|
|
|
case *tls.Conn:
|
|
|
|
|
tcpConn, ok = conn.NetConn().(*net.TCPConn)
|
|
|
|
|
default:
|
|
|
|
|
tcpConn, ok = this.rawConn.(*net.TCPConn)
|
|
|
|
|
}
|
|
|
|
|
return
|
2022-01-13 11:36:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetLinger 设置Linger
|
|
|
|
|
func (this *BaseClientConn) SetLinger(seconds int) error {
|
|
|
|
|
tcpConn, ok := this.TCPConn()
|
|
|
|
|
if ok {
|
|
|
|
|
return tcpConn.SetLinger(seconds)
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|