Improve cs2+udp proto for xiaomi source
This commit is contained in:
+26
-13
@@ -2,6 +2,7 @@ package cs2
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -46,6 +47,7 @@ type Conn struct {
|
|||||||
const (
|
const (
|
||||||
magic = 0xF1
|
magic = 0xF1
|
||||||
magicDrw = 0xD1
|
magicDrw = 0xD1
|
||||||
|
magicTCP = 0x68
|
||||||
msgLanSearch = 0x30
|
msgLanSearch = 0x30
|
||||||
msgPunchPkt = 0x41
|
msgPunchPkt = 0x41
|
||||||
msgP2PRdyUDP = 0x42
|
msgP2PRdyUDP = 0x42
|
||||||
@@ -121,6 +123,11 @@ func (c *Conn) worker() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 0 f1d0 magic
|
||||||
|
// 2 005d size = total size + 4
|
||||||
|
// 4 d1 magic
|
||||||
|
// 5 00 channel
|
||||||
|
// 6 0000 seq
|
||||||
switch buf[1] {
|
switch buf[1] {
|
||||||
case msgDrw:
|
case msgDrw:
|
||||||
ch := buf[5]
|
ch := buf[5]
|
||||||
@@ -134,22 +141,27 @@ func (c *Conn) worker() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// For UDP we should using ack.
|
// For UDP we should using ack.
|
||||||
seqHI := buf[6]
|
seq := binary.BigEndian.Uint16(buf[6:])
|
||||||
seqLO := buf[7]
|
diff := int16(seq - chAck[ch])
|
||||||
|
|
||||||
if chAck[ch] != uint16(seqHI)<<8|uint16(seqLO) {
|
if diff > 0 {
|
||||||
continue
|
continue // new seq - skip before ack
|
||||||
}
|
}
|
||||||
chAck[ch]++
|
|
||||||
|
|
||||||
ack := []byte{magic, msgDrwAck, 0, 6, magicDrw, ch, 0, 1, seqHI, seqLO}
|
ack := []byte{magic, msgDrwAck, 0, 6, magicDrw, ch, 0, 1, buf[6], buf[7]}
|
||||||
_, _ = c.conn.Write(ack)
|
_, _ = c.conn.Write(ack)
|
||||||
|
|
||||||
|
if diff < 0 {
|
||||||
|
continue // old seq - skip after ack
|
||||||
|
}
|
||||||
|
|
||||||
|
chAck[ch]++ // expected seq - OK
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ch {
|
switch ch {
|
||||||
case 0:
|
case 0:
|
||||||
select {
|
select {
|
||||||
case c.rawCh0 <- buf[12:]:
|
case c.rawCh0 <- bytes.Clone(buf[12:n]):
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
@@ -343,23 +355,24 @@ type udpConn struct {
|
|||||||
addr *net.UDPAddr
|
addr *net.UDPAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) Read(p []byte) (n int, err error) {
|
func (c *udpConn) Read(b []byte) (n int, err error) {
|
||||||
var addr *net.UDPAddr
|
var addr *net.UDPAddr
|
||||||
for {
|
for {
|
||||||
n, addr, err = c.UDPConn.ReadFromUDP(p)
|
n, addr, err = c.UDPConn.ReadFromUDP(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if string(addr.IP) == string(c.addr.IP) || n >= 8 {
|
if string(addr.IP) == string(c.addr.IP) || n >= 8 {
|
||||||
|
//log.Printf("<- %x", b[:n])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) Write(req []byte) (n int, err error) {
|
func (c *udpConn) Write(b []byte) (n int, err error) {
|
||||||
//log.Printf("-> %x", req)
|
//log.Printf("-> %x", b)
|
||||||
return c.UDPConn.WriteToUDP(req, c.addr)
|
return c.UDPConn.WriteToUDP(b, c.addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *udpConn) RemoteAddr() net.Addr {
|
func (c *udpConn) RemoteAddr() net.Addr {
|
||||||
@@ -425,7 +438,7 @@ func (c *tcpConn) Write(req []byte) (n int, err error) {
|
|||||||
n = len(req)
|
n = len(req)
|
||||||
buf := make([]byte, 8+n)
|
buf := make([]byte, 8+n)
|
||||||
binary.BigEndian.PutUint16(buf, uint16(n))
|
binary.BigEndian.PutUint16(buf, uint16(n))
|
||||||
buf[2] = 0x68
|
buf[2] = magicTCP
|
||||||
copy(buf[8:], req)
|
copy(buf[8:], req)
|
||||||
//log.Printf("-> %x", buf)
|
//log.Printf("-> %x", buf)
|
||||||
_, err = c.TCPConn.Write(buf)
|
_, err = c.TCPConn.Write(buf)
|
||||||
|
|||||||
Reference in New Issue
Block a user