|
@@ -12,6 +12,7 @@ import (
|
|
|
"ipsomc/module/ps/psmodel"
|
|
|
"ipsomc/module/ps/psul"
|
|
|
"ipsomc/module/socket/socketsend"
|
|
|
+ "ipsomc/public"
|
|
|
"ipsomc/util"
|
|
|
"net"
|
|
|
"os"
|
|
@@ -85,6 +86,7 @@ func (obj *SocketCreate) CreateUdpSocket() {
|
|
|
|
|
|
// 创建TCP Socket
|
|
|
func (obj *SocketCreate) CreateTcpSocket() {
|
|
|
+
|
|
|
myViper := util.GetViper()
|
|
|
hostaddress := myViper.GetString("socket.hostaddress") //主机地址
|
|
|
hostport := myViper.GetInt("socket.hostport") //主机端口
|
|
@@ -121,6 +123,8 @@ func (obj *SocketCreate) CreateTcpSocket() {
|
|
|
// 处理每一个TCP连接
|
|
|
func (obj *SocketCreate) HandleTcpConnection(conn *net.TCPConn) {
|
|
|
defer conn.Close()
|
|
|
+ // conn.SetKeepAlive(false)
|
|
|
+ // conn.SetKeepAlivePeriod(5 * time.Minute) // 每隔5分钟检测连接
|
|
|
|
|
|
//保存tcp连接句柄
|
|
|
address := conn.RemoteAddr().String()
|
|
@@ -132,36 +136,49 @@ func (obj *SocketCreate) HandleTcpConnection(conn *net.TCPConn) {
|
|
|
for {
|
|
|
tmpBuffer := make([]byte, 1024) //临时缓存
|
|
|
n, err := reader.Read(tmpBuffer) //从客户端读取数据
|
|
|
- if err != nil && err != io.EOF {
|
|
|
- fmt.Println("Error reading:", err.Error())
|
|
|
- obj.socketSendApi.DeleteTcpConnHandle(address) //删除一个tcp连接
|
|
|
+ if err != nil {
|
|
|
+ if err == io.EOF {
|
|
|
+ fmt.Println("客户端已关闭链接:", err.Error())
|
|
|
+ } else {
|
|
|
+ fmt.Println("从客户端读取数据错误:", err.Error())
|
|
|
+ }
|
|
|
+ obj.socketSendApi.DeleteTcpConnHandle(address)
|
|
|
break
|
|
|
}
|
|
|
dataBuffer = append(dataBuffer, tmpBuffer[:n]...) //把数据追加到数据缓存中
|
|
|
|
|
|
//成帧处理,并且把数据发送给协议栈
|
|
|
for len(dataBuffer) > psmodel.PS_FRAME_MIN_LEN { //数据长度大于最小帧长
|
|
|
- if dataBuffer[0] == psmodel.PS_AP_END_FLAG {
|
|
|
- // 查找数据包的结尾
|
|
|
- endIndex := bytes.IndexByte(dataBuffer[1:], psmodel.PS_AP_END_FLAG)
|
|
|
- if endIndex != -1 {
|
|
|
- // 找到了完整的数据包
|
|
|
- dataPacket := dataBuffer[0 : endIndex+2] // 包括结尾的0x7E
|
|
|
- dataBuffer = dataBuffer[endIndex+2:] // 移除已处理的数据包,包括结尾的0x7E
|
|
|
+ // 查找第一个合法帧头(0x7E)
|
|
|
+ startIndex := bytes.IndexByte(dataBuffer, psmodel.PS_AP_END_FLAG)
|
|
|
+ if startIndex == -1 {
|
|
|
+ // 无合法帧头,清空缓存
|
|
|
+ dataBuffer = dataBuffer[:0]
|
|
|
+ break
|
|
|
+ } else if startIndex > 0 {
|
|
|
+ // 丢弃帧头前的无效数据
|
|
|
+ dataBuffer = dataBuffer[startIndex:]
|
|
|
+ }
|
|
|
|
|
|
- //开启goroutine,将数据报文发送给协议栈模块
|
|
|
- go obj.psUlApi.PsUlTcp(address, dataPacket, len(dataPacket))
|
|
|
+ // 继续查找帧尾(第二个0x7E)
|
|
|
+ endIndex := bytes.IndexByte(dataBuffer[1:], psmodel.PS_AP_END_FLAG)
|
|
|
+ if endIndex == -1 {
|
|
|
+ // 未找到帧尾,等待更多数据
|
|
|
+ break
|
|
|
+ }
|
|
|
|
|
|
- fmt.Printf("Received %d bytes from %s\n", len(dataPacket), address)
|
|
|
- } else {
|
|
|
- // 没有找到结尾,等待更多数据
|
|
|
- break
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 丢弃非法数据(数据以0x7E开头),并等待更多数据
|
|
|
- dataBuffer = dataBuffer[1:]
|
|
|
+ // 提取完整数据包(包含头尾的0x7E)
|
|
|
+ dataPacket := dataBuffer[0 : endIndex+2]
|
|
|
+ dataBuffer = dataBuffer[endIndex+2:]
|
|
|
+
|
|
|
+ //开启goroutine,将数据报文发送给协议栈模块
|
|
|
+ go obj.psUlApi.PsUlTcp(address, dataPacket, len(dataPacket))
|
|
|
+
|
|
|
+ //获得系统工作模式
|
|
|
+ sysWorkMode := public.PublicGetSysWorkMode()
|
|
|
+ if sysWorkMode == 0 {
|
|
|
+ fmt.Printf("Received %d bytes from %s\n", len(dataPacket), address)
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|