Commit ab1316b4 by zhangjiec

统计socket连接数量的变量改为原子操作

parent 5f865c50
...@@ -70,8 +70,8 @@ func (dev *DCPhone10) getOnlineList(c *gin.Context) { ...@@ -70,8 +70,8 @@ func (dev *DCPhone10) getOnlineList(c *gin.Context) {
//查在线设备总数量 //查在线设备总数量
func (dev *DCPhone10) getOnlineTotal(c *gin.Context) { func (dev *DCPhone10) getOnlineTotal(c *gin.Context) {
type DataO struct { type DataO struct {
Count int `json:"count"` Count int `json:"count"`
Socket int `json:"socket"` Socket int32 `json:"socket"`
} }
var dataOut DataO var dataOut DataO
dev.ConnectMap.Range(func(_, _ interface{}) bool { dev.ConnectMap.Range(func(_, _ interface{}) bool {
...@@ -92,7 +92,7 @@ func (dev *DCPhone10) getOnlineAll(c *gin.Context) { ...@@ -92,7 +92,7 @@ func (dev *DCPhone10) getOnlineAll(c *gin.Context) {
type DataO struct { type DataO struct {
Count int `json:"count"` Count int `json:"count"`
DevID []uint32 `json:"devId"` DevID []uint32 `json:"devId"`
Socket int `json:"socket"` Socket int32 `json:"socket"`
} }
var dataOut DataO var dataOut DataO
//dataOut.DevID = make([]uint32,0,5000) //dataOut.DevID = make([]uint32,0,5000)
......
...@@ -53,6 +53,7 @@ type devUpRestartLogin struct { ...@@ -53,6 +53,7 @@ type devUpRestartLogin struct {
DevID []uint32 `json:"devId"` DevID []uint32 `json:"devId"`
Value struct { Value struct {
ResetReason byte `json:"reset_reason"` ResetReason byte `json:"reset_reason"`
ResetCode byte `json:"reset_code"`
Imei0 string `json:"imei_0"` Imei0 string `json:"imei_0"`
Iccid0 string `json:"iccid_0"` Iccid0 string `json:"iccid_0"`
Imei1 string `json:"imei_1"` Imei1 string `json:"imei_1"`
......
...@@ -102,10 +102,10 @@ func (dev *DCPhone10) response(data *tcplongserver.HexData) { ...@@ -102,10 +102,10 @@ func (dev *DCPhone10) response(data *tcplongserver.HexData) {
}{0, 0}, }{0, 0},
} }
if data.Data[0]|1 != 0 { if data.Data[0]&1 != 0 {
jsonStruct.Value.Call = 1 jsonStruct.Value.Call = 1
} }
if data.Data[0]|2 != 0 { if data.Data[0]&2 != 0 {
jsonStruct.Value.Net = 1 jsonStruct.Value.Net = 1
} }
...@@ -265,7 +265,14 @@ func (dev *DCPhone10) response(data *tcplongserver.HexData) { ...@@ -265,7 +265,14 @@ func (dev *DCPhone10) response(data *tcplongserver.HexData) {
DevTime: data.TimeUtc, DevTime: data.TimeUtc,
DevID: []uint32{data.DevID}, DevID: []uint32{data.DevID},
} }
jsonStruct.Value.ResetReason = data.Data[0] // test if data.Data[0]&0x03 == 0x03 {
jsonStruct.Value.ResetReason = 0 // 正常上电
} else if data.Data[0] == 0x40 {
jsonStruct.Value.ResetReason = 1 // 软件复位
} else {
jsonStruct.Value.ResetReason = 2 // 异常复位
}
jsonStruct.Value.ResetCode = data.Data[0] // test
jsonStruct.Value.Imei0 = string(data.Data[1:16]) //从索引1到索引16(不包含) jsonStruct.Value.Imei0 = string(data.Data[1:16]) //从索引1到索引16(不包含)
jsonStruct.Value.Iccid0 = string(data.Data[16:36]) jsonStruct.Value.Iccid0 = string(data.Data[16:36])
jsonStruct.Value.Imei1 = string(data.Data[36:51]) jsonStruct.Value.Imei1 = string(data.Data[36:51])
......
...@@ -15,7 +15,7 @@ var ( ...@@ -15,7 +15,7 @@ var (
HttpClientTimeOut time.Duration HttpClientTimeOut time.Duration
TcpLongPort string TcpLongPort string
TcpLongMaxConnections int TcpLongMaxConnections int32
TcpLongNewConnReadDeadline time.Duration TcpLongNewConnReadDeadline time.Duration
TcpLongNewConnRightfulTimeout int64 TcpLongNewConnRightfulTimeout int64
TcpLongOldConnReadDeadline time.Duration TcpLongOldConnReadDeadline time.Duration
...@@ -47,7 +47,7 @@ func ConfigInit() { ...@@ -47,7 +47,7 @@ func ConfigInit() {
HttpClientTimeOut = time.Duration(file.Section("http_client").Key("TimeOut").MustInt(5)) * time.Second HttpClientTimeOut = time.Duration(file.Section("http_client").Key("TimeOut").MustInt(5)) * time.Second
TcpLongPort = file.Section("tcp_long_server").Key("TcpPort").MustString("60000") TcpLongPort = file.Section("tcp_long_server").Key("TcpPort").MustString("60000")
TcpLongMaxConnections = int(file.Section("tcp_long_server").Key("MaxConnections").MustUint(20000)) TcpLongMaxConnections = int32(file.Section("tcp_long_server").Key("MaxConnections").MustUint(20000))
TcpLongNewConnReadDeadline = time.Duration(file.Section("tcp_long_server").Key("NewConnReadDeadline").MustInt(60)) * time.Second TcpLongNewConnReadDeadline = time.Duration(file.Section("tcp_long_server").Key("NewConnReadDeadline").MustInt(60)) * time.Second
TcpLongNewConnRightfulTimeout = file.Section("tcp_long_server").Key("NewConnRightfulTimeout").MustInt64(120) TcpLongNewConnRightfulTimeout = file.Section("tcp_long_server").Key("NewConnRightfulTimeout").MustInt64(120)
TcpLongOldConnReadDeadline = time.Duration(file.Section("tcp_long_server").Key("OldConnReadDeadline").MustInt(180)) * time.Second TcpLongOldConnReadDeadline = time.Duration(file.Section("tcp_long_server").Key("OldConnReadDeadline").MustInt(180)) * time.Second
......
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"net" "net"
"strconv" "strconv"
"sync" "sync"
"sync/atomic"
"time" "time"
) )
...@@ -18,10 +19,10 @@ type ITCPLongServer interface { ...@@ -18,10 +19,10 @@ type ITCPLongServer interface {
type receiveCallbackFunc func(*net.TCPConn, []byte) uint32 //定义接收到数据的回调函数的函数类型 type receiveCallbackFunc func(*net.TCPConn, []byte) uint32 //定义接收到数据的回调函数的函数类型
type TCPLongServer struct { type TCPLongServer struct {
TCPReceive receiveCallbackFunc TCPReceive receiveCallbackFunc
ConnSocketCount int ConnSocketCount int32
ConnectMap sync.Map // 用这个可能性能不行,测试下,不行就用map加锁 ConnectMap sync.Map // 用这个可能性能不行,测试下,不行就用map加锁
rwConnSocketCount chan int // rwConnSocketCount chan int // 20210815 将对ConnSocketCount的操作修改为原子操作
// ConnectMapRWMutex sync.RWMutex // ConnectMapRWMutex sync.RWMutex
// ConnectMap map[uint32]*net.TCPConn // Connection // ConnectMap map[uint32]*net.TCPConn // Connection
} }
...@@ -42,17 +43,17 @@ func (s *TCPLongServer) TCPStart(port string) { ...@@ -42,17 +43,17 @@ func (s *TCPLongServer) TCPStart(port string) {
zap.Error(err)) zap.Error(err))
} }
s.rwConnSocketCount = make(chan int) //s.rwConnSocketCount = make(chan int) // 20210815 将对ConnSocketCount的操作修改为原子操作
go func() { //go func() {
for { // for {
s.ConnSocketCount += <-s.rwConnSocketCount // s.ConnSocketCount += <-s.rwConnSocketCount
if s.ConnSocketCount < 0 { // if s.ConnSocketCount < 0 {
s.ConnSocketCount = 0 // s.ConnSocketCount = 0
logger.Log.Error("s.ConnSocketCount <0", // logger.Log.Error("s.ConnSocketCount <0",
zap.Int("ConnSocketCount", s.ConnSocketCount)) // zap.Int("ConnSocketCount", s.ConnSocketCount))
} // }
} // }
}() //}()
// 启动server // 启动server
for { for {
...@@ -87,18 +88,18 @@ func (s *TCPLongServer) TCPStart(port string) { ...@@ -87,18 +88,18 @@ func (s *TCPLongServer) TCPStart(port string) {
func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCallbackFunc) { func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCallbackFunc) {
var myDevID uint32 // golang 默认0 var myDevID uint32 // golang 默认0
s.rwConnSocketCount <- 1 atomic.AddInt32(&s.ConnSocketCount, 1)
defer func() { defer func() {
s.rwConnSocketCount <- -1 //s.rwConnSocketCount <- -1
//if s.ConnSocketCount > 0 { if s.ConnSocketCount > 0 {
// s.ConnSocketCount-- atomic.AddInt32(&s.ConnSocketCount, -1)
//} else { } else {
// logger.Log.Error("s.ConnSocketCount error", logger.Log.Error("s.ConnSocketCount error",
// zap.String("Src", "TCP-SERVER-connectionHandle"), zap.String("Src", "TCP-SERVER-connectionHandle"),
// zap.Uint32("DevId", myDevID), zap.Uint32("DevId", myDevID),
// zap.String("Conn", conn.RemoteAddr().String()), zap.String("Conn", conn.RemoteAddr().String()),
// zap.Int("ConnSocketCount", s.ConnSocketCount)) zap.Int32("ConnSocketCount", s.ConnSocketCount))
//} }
if myDevID != 0 { if myDevID != 0 {
if connMyID, ok := s.ConnectMap.Load(myDevID); ok { //查一下设备旧链接还在的话,关掉 if connMyID, ok := s.ConnectMap.Load(myDevID); ok { //查一下设备旧链接还在的话,关掉
if co, ok := connMyID.(*net.TCPConn); ok { // 类型断言 if co, ok := connMyID.(*net.TCPConn); ok { // 类型断言
...@@ -157,11 +158,11 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall ...@@ -157,11 +158,11 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
// } // }
//}() //}()
if s.ConnSocketCount > jeffutil.TcpLongMaxConnections { //限制最大连接数2万个配置文件 最大连接限制数添加到配置文件 if s.ConnSocketCount > jeffutil.TcpLongMaxConnections { //限制最大连接数2万个配置文件 最大连接限制数添加到配置文件
logger.Log.Warn("ConnSocketCount overrun:"+strconv.Itoa(jeffutil.TcpLongMaxConnections), logger.Log.Warn("ConnSocketCount overrun:"+strconv.Itoa(int(jeffutil.TcpLongMaxConnections)),
zap.String("Src", "TCP-SERVER-connectionHandle"), zap.String("Src", "TCP-SERVER-connectionHandle"),
zap.Uint32("DevId", myDevID), zap.Uint32("DevId", myDevID),
zap.String("Conn", conn.RemoteAddr().String()), zap.String("Conn", conn.RemoteAddr().String()),
zap.Int("ConnSocketCount", s.ConnSocketCount)) zap.Int32("ConnSocketCount", s.ConnSocketCount))
return return
} }
...@@ -178,7 +179,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall ...@@ -178,7 +179,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
zap.String("Src", "TCP-SERVER-connectionHandle"), zap.String("Src", "TCP-SERVER-connectionHandle"),
// zap.Uint32("DevId", myDevID), // zap.Uint32("DevId", myDevID),
zap.String("Conn", conn.RemoteAddr().String()), zap.String("Conn", conn.RemoteAddr().String()),
zap.Int("ConnSocketCount", s.ConnSocketCount)) zap.Int32("ConnSocketCount", s.ConnSocketCount))
return return
} }
if err := conn.SetReadDeadline(time.Now().Add(jeffutil.TcpLongNewConnReadDeadline)); err != nil { // 配置文件 新连接1分钟超时未收到数据(配置文件用秒) if err := conn.SetReadDeadline(time.Now().Add(jeffutil.TcpLongNewConnReadDeadline)); err != nil { // 配置文件 新连接1分钟超时未收到数据(配置文件用秒)
...@@ -187,7 +188,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall ...@@ -187,7 +188,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
zap.Uint32("DevId", myDevID), zap.Uint32("DevId", myDevID),
zap.String("Conn", conn.RemoteAddr().String()), zap.String("Conn", conn.RemoteAddr().String()),
zap.Error(err), zap.Error(err),
zap.Int("ConnSocketCount", s.ConnSocketCount)) zap.Int32("ConnSocketCount", s.ConnSocketCount))
return return
} }
} else { } else {
...@@ -197,7 +198,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall ...@@ -197,7 +198,7 @@ func (s *TCPLongServer) connectionHandle(conn *net.TCPConn, callBack receiveCall
zap.Uint32("DevId", myDevID), zap.Uint32("DevId", myDevID),
zap.String("Conn", conn.RemoteAddr().String()), zap.String("Conn", conn.RemoteAddr().String()),
zap.Error(err), zap.Error(err),
zap.Int("ConnSocketCount", s.ConnSocketCount)) zap.Int32("ConnSocketCount", s.ConnSocketCount))
return return
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment