소스 검색

修复客户端读取包头缺陷

Tao Zhang 6 년 전
부모
커밋
d493dd93a8
7개의 변경된 파일25개의 추가작업 그리고 16개의 파일을 삭제
  1. 6 0
      bin/README.md
  2. BIN
      bin/msgserver
  3. BIN
      bin/service
  4. 8 2
      src/mfw/util/client.go
  5. 4 4
      src/mfw/util/protocol.go
  6. 4 4
      src/mfw/util/server.go
  7. 3 6
      src/服务端/main.go

+ 6 - 0
bin/README.md

@@ -0,0 +1,6 @@
+使用说明
+#启动服务端
+./msgserver -usetls=true -ca=ca.crt -cert=msg.xiaoa7.com.crt -key=msg.xiaoa7.com.key
+
+#启动客户端
+./service -usetls=true -cert=demo.xiaoa7.com.crt -key=demo.xiaoa7.com.key 

BIN
bin/msgserver


BIN
bin/service


+ 8 - 2
src/mfw/util/client.go

@@ -2,6 +2,7 @@
 package util
 
 import (
+	"bytes"
 	"crypto/tls"
 	"encoding/binary"
 	"errors"
@@ -145,6 +146,7 @@ func (client *Client) baseEventHandle(msg *Packet) {
 	event := int(msg.Event)
 	switch event {
 	case EVENT_REQUEST_HEARTBEAT: //请求的心跳,回应心跳请求
+		Log.Info.Println("服务端请求心跳")
 		client.WriteObj("", "", EVENT_RETURN_HEARTBEAT, SENDTO_TYPE_P2P, msg.Raw)
 		client.lastCheckHeart = time.Now().Unix()
 	case EVENT_RETURN: //回调处理,一般用于同步操作
@@ -163,12 +165,16 @@ func (client *Client) baseEventHandle(msg *Packet) {
 //从套接字读取数据
 func (client *Client) read4socket() (*Packet, error) {
 	defer Catch()
-	buffer := make([]byte, 4)
+	buffer := make([]byte, 8)
 	if _, err := io.ReadFull(client.conn, buffer); err != nil {
 		Log.Debug.Println("读取包头失败", err)
 		return nil, errors.New("read packet error")
 	}
-	size := int32(binary.BigEndian.Uint32(buffer))
+	if bytes.Compare(buffer[:4], PACKET_HEAD) != 0 {
+		Log.Debug.Println("包头校验失败")
+		return nil, errors.New("read packet head error")
+	}
+	size := int32(binary.BigEndian.Uint32(buffer[4:]))
 	if size < PACKET_MIN_LEN || size > PACKET_MAX_LEN {
 		Log.Debug.Println("数据包长度越界[", size, "]")
 		return nil, errors.New("read packet error")

+ 4 - 4
src/mfw/util/protocol.go

@@ -7,7 +7,7 @@ import (
 	"encoding/json"
 	"errors"
 	"hash/crc32"
-	"net"
+	"io"
 )
 
 const (
@@ -32,9 +32,9 @@ type Packet struct {
 	Event      int32  //4bit
 	SentToType int32  //4bit
 	//头结束
-	Raw  []byte   //数据区域
-	Sum  int32    //crc32校验和 (从长度标志到数据区域)
-	Conn net.Conn //
+	Raw  []byte             //数据区域
+	Sum  int32              //crc32校验和 (从长度标志到数据区域)
+	Conn io.ReadWriteCloser //
 }
 
 //

+ 4 - 4
src/mfw/util/server.go

@@ -72,13 +72,13 @@ func StartServer(conf *ServerConfig) {
 
 //读取
 type Reader struct {
-	conn   net.Conn
+	conn   io.ReadWriteCloser
 	reader *bufio.Reader
 	buf    []byte
 }
 
 //
-func NewReader(c net.Conn) *Reader {
+func NewReader(c io.ReadWriteCloser) *Reader {
 	return &Reader{
 		conn:   c,
 		reader: bufio.NewReader(c),
@@ -150,11 +150,11 @@ func forwardMessage(c net.Conn, queue chan<- *Packet) {
 }
 
 //从队列中读取数据,定期处理
-func processMsg(q <-chan *Packet, parseEvent func(*Packet)) {
+func processMsg(q <-chan *Packet, processEvent func(*Packet)) {
 	for {
 		select {
 		case msg := <-q:
-			go parseEvent(msg)
+			go processEvent(msg)
 		}
 	}
 }

+ 3 - 6
src/服务端/main.go

@@ -5,20 +5,19 @@ import (
 	"errors"
 	"flag"
 	"fmt"
+	"io"
 	"math/rand"
 	"mfw/util"
-	"net"
 	"sync"
 	"time"
 )
 
 //
 type ClientItem struct {
-	conn            net.Conn
+	conn            io.ReadWriteCloser
 	timestamp       int64
 	name            string //
 	canhandlerevent []int  //
-	ip              string
 	id              string
 }
 
@@ -45,6 +44,7 @@ func gc() {
 			removeClient(k)
 			continue
 		} else if now-v.timestamp > gcinterval {
+			util.Log.Debug.Println("发送心跳请求包到", v.name)
 			_, err := v.conn.Write(util.Enpacket("", k, "", util.EVENT_REQUEST_HEARTBEAT,
 				util.SENDTO_TYPE_P2P, now_bs))
 			if err != nil { //发心跳包出错
@@ -138,7 +138,6 @@ func viewallservice(p *util.Packet) {
 			"handle": fmt.Sprintf("%v", v.canhandlerevent),
 			"name":   v.name,
 			"myid":   k,
-			"ip":     v.ip,
 		})
 	}
 	lock.Unlock()
@@ -148,7 +147,6 @@ func viewallservice(p *util.Packet) {
 
 //加入网络
 func join(msg *util.Packet) {
-	util.Log.Debug.Printf("% X\n", msg.Raw)
 	data := map[string]interface{}{}
 	err := json.Unmarshal(msg.Raw, &data)
 	if err != nil { //解析join指令失败
@@ -173,7 +171,6 @@ func join(msg *util.Packet) {
 	allclient[uuid] = &ClientItem{conn: msg.Conn,
 		timestamp: time.Now().Unix(),
 		name:      clientname,
-		ip:        msg.Conn.RemoteAddr().String(),
 		id:        uuid,
 	}
 	//