This commit is contained in:
esrrhs 2019-10-22 21:27:21 +08:00
parent 05b7ff19aa
commit a72544515e
6 changed files with 94 additions and 159 deletions

View File

@ -15,8 +15,8 @@ const (
RECV_PROTO int = 0
)
func NewClient(addr string, server string, target string, timeout int, catch int, key int,
tcpmode int) (*Client, error) {
func NewClient(addr string, server string, target string, timeout int, key int,
tcpmode int, tcpmode_buffersize int, tcpmode_maxwin int, tcpmode_resend_timems int) (*Client, error) {
var ipaddr *net.UDPAddr
var tcpaddr *net.TCPAddr
@ -49,9 +49,11 @@ func NewClient(addr string, server string, target string, timeout int, catch int
addrServer: server,
targetAddr: target,
timeout: timeout,
catch: catch,
key: key,
tcpmode: tcpmode,
tcpmode_buffersize: tcpmode_buffersize,
tcpmode_maxwin: tcpmode_maxwin,
tcpmode_resend_timems: tcpmode_resend_timems,
}, nil
}
@ -62,7 +64,6 @@ type Client struct {
timeout int
sproto int
rproto int
catch int
key int
tcpmode int
tcpmode_buffersize int
@ -89,9 +90,6 @@ type Client struct {
recvPacket uint64
sendPacketSize uint64
recvPacketSize uint64
sendCatchPacket uint64
recvCatchPacket uint64
}
type ClientConn struct {
@ -167,24 +165,12 @@ func (p *Client) Run() {
interval := time.NewTicker(time.Second)
defer interval.Stop()
inter := 1000
if p.catch > 0 {
inter = 1000 / p.catch
if inter <= 0 {
inter = 1
}
}
intervalCatch := time.NewTicker(time.Millisecond * time.Duration(inter))
defer intervalCatch.Stop()
for {
select {
case <-interval.C:
p.checkTimeoutConn()
p.ping()
p.showNet()
case <-intervalCatch.C:
p.sendCatch()
case r := <-recv:
p.processPacket(r)
}
@ -274,7 +260,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn) {
p.sendPacketSize += (uint64)(len(mb))
sendICMP(p.id, p.sequence, *p.conn, p.ipaddrServer, p.targetAddr, clientConn.id, (uint32)(MyMsg_DATA), mb,
SEND_PROTO, RECV_PROTO, p.catch, p.key,
SEND_PROTO, RECV_PROTO, p.key,
p.tcpmode, p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems)
}
}
@ -317,7 +303,7 @@ func (p *Client) Accept() error {
clientConn.activeTime = now
sendICMP(p.id, p.sequence, *p.conn, p.ipaddrServer, p.targetAddr, clientConn.id, (uint32)(MyMsg_DATA), bytes[:n],
SEND_PROTO, RECV_PROTO, p.catch, p.key,
SEND_PROTO, RECV_PROTO, p.key,
p.tcpmode, p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems)
p.sequence++
@ -362,10 +348,6 @@ func (p *Client) processPacket(packet *Packet) {
now := time.Now()
clientConn.activeTime = now
if packet.my.Type == (int32)(MyMsg_CATCH) {
p.recvCatchPacket++
}
_, err := p.listenConn.WriteToUDP(packet.my.Data, addr)
if err != nil {
loggo.Error("WriteToUDP Error read udp %s", err)
@ -411,7 +393,7 @@ func (p *Client) ping() {
now := time.Now()
b, _ := now.MarshalBinary()
sendICMP(p.id, p.sequence, *p.conn, p.ipaddrServer, p.targetAddr, "", (uint32)(MyMsg_PING), b,
SEND_PROTO, RECV_PROTO, p.catch, p.key,
SEND_PROTO, RECV_PROTO, p.key,
p.tcpmode, p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems)
loggo.Info("ping %s %s %d %d %d %d", p.addrServer, now.String(), p.sproto, p.rproto, p.id, p.sequence)
p.sequence++
@ -419,24 +401,10 @@ func (p *Client) ping() {
}
func (p *Client) showNet() {
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s sendCatch %d/s recvCatch %d/s",
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024, p.sendCatchPacket, p.recvCatchPacket)
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s",
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024)
p.sendPacket = 0
p.recvPacket = 0
p.sendPacketSize = 0
p.recvPacketSize = 0
p.sendCatchPacket = 0
p.recvCatchPacket = 0
}
func (p *Client) sendCatch() {
if p.catch > 0 {
for _, conn := range p.localIdToConnMap {
sendICMP(p.id, p.sequence, *p.conn, p.ipaddrServer, p.targetAddr, conn.id, (uint32)(MyMsg_CATCH), make([]byte, 0),
SEND_PROTO, RECV_PROTO, p.catch, p.key,
p.tcpmode, p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems)
p.sequence++
p.sendCatchPacket++
}
}
}

View File

@ -3,7 +3,6 @@ package pingtunnel
import (
"container/list"
"github.com/esrrhs/go-engine/src/rbuffergo"
"math/rand"
"sync"
"time"
)
@ -27,7 +26,7 @@ func NewFrameMgr(buffersize int, windowsize int, resend_timems int) *FrameMgr {
fm := &FrameMgr{sendb: sendb, recvb: recvb,
sendlock: &sync.Mutex{}, recvlock: &sync.Mutex{},
windowsize: windowsize, win: list.New(), sendid: rand.Int() % (FRAME_MAX_ID + 1),
windowsize: windowsize, win: list.New(), sendid: 0,
resend_timems: resend_timems, sendlist: list.New()}
return fm

View File

@ -25,19 +25,16 @@ type MyMsg_TYPE int32
const (
MyMsg_DATA MyMsg_TYPE = 0
MyMsg_PING MyMsg_TYPE = 1
MyMsg_CATCH MyMsg_TYPE = 2
)
var MyMsg_TYPE_name = map[int32]string{
0: "DATA",
1: "PING",
2: "CATCH",
}
var MyMsg_TYPE_value = map[string]int32{
"DATA": 0,
"PING": 1,
"CATCH": 2,
}
func (x MyMsg_TYPE) String() string {
@ -48,13 +45,40 @@ func (MyMsg_TYPE) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_c06e4cca6c2cc899, []int{0, 0}
}
type Frame_TYPE int32
const (
Frame_DATA Frame_TYPE = 0
Frame_REQ Frame_TYPE = 1
Frame_ACK Frame_TYPE = 2
)
var Frame_TYPE_name = map[int32]string{
0: "DATA",
1: "REQ",
2: "ACK",
}
var Frame_TYPE_value = map[string]int32{
"DATA": 0,
"REQ": 1,
"ACK": 2,
}
func (x Frame_TYPE) String() string {
return proto.EnumName(Frame_TYPE_name, int32(x))
}
func (Frame_TYPE) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_c06e4cca6c2cc899, []int{1, 0}
}
type MyMsg struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Type int32 `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"`
Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"`
Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
Rproto int32 `protobuf:"varint,5,opt,name=rproto,proto3" json:"rproto,omitempty"`
Catch int32 `protobuf:"varint,6,opt,name=catch,proto3" json:"catch,omitempty"`
Key int32 `protobuf:"varint,7,opt,name=key,proto3" json:"key,omitempty"`
Tcpmode int32 `protobuf:"varint,8,opt,name=tcpmode,proto3" json:"tcpmode,omitempty"`
TcpmodeBuffersize int32 `protobuf:"varint,9,opt,name=tcpmode_buffersize,json=tcpmodeBuffersize,proto3" json:"tcpmode_buffersize,omitempty"`
@ -125,13 +149,6 @@ func (m *MyMsg) GetRproto() int32 {
return 0
}
func (m *MyMsg) GetCatch() int32 {
if m != nil {
return m.Catch
}
return 0
}
func (m *MyMsg) GetKey() int32 {
if m != nil {
return m.Key
@ -248,6 +265,7 @@ func (m *Frame) GetDataid() []int32 {
func init() {
proto.RegisterEnum("MyMsg_TYPE", MyMsg_TYPE_name, MyMsg_TYPE_value)
proto.RegisterEnum("Frame_TYPE", Frame_TYPE_name, Frame_TYPE_value)
proto.RegisterType((*MyMsg)(nil), "MyMsg")
proto.RegisterType((*Frame)(nil), "Frame")
}
@ -255,27 +273,26 @@ func init() {
func init() { proto.RegisterFile("msg.proto", fileDescriptor_c06e4cca6c2cc899) }
var fileDescriptor_c06e4cca6c2cc899 = []byte{
// 339 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x51, 0xcb, 0x6e, 0xe2, 0x30,
0x14, 0x1d, 0x27, 0x71, 0x48, 0xee, 0x30, 0x28, 0x73, 0x67, 0x5a, 0x59, 0x5d, 0x45, 0x48, 0x48,
0x6c, 0xda, 0x45, 0xfb, 0x05, 0x40, 0x9f, 0x0b, 0x2a, 0x14, 0x65, 0xd3, 0x6e, 0x50, 0x20, 0x26,
0xb5, 0xda, 0x84, 0x28, 0x31, 0x6a, 0xe9, 0x2f, 0xf4, 0x2f, 0xfb, 0x25, 0x95, 0x2f, 0x06, 0x89,
0x95, 0xcf, 0x4b, 0xb6, 0x75, 0x0e, 0x84, 0x65, 0x5b, 0x5c, 0xd4, 0xcd, 0x5a, 0xaf, 0xfb, 0xdf,
0x0e, 0xf0, 0xe9, 0x76, 0xda, 0x16, 0xd8, 0x03, 0x47, 0xe5, 0x82, 0xc5, 0x6c, 0x18, 0x26, 0x8e,
0xca, 0x11, 0xc1, 0xd3, 0xdb, 0x5a, 0x0a, 0x27, 0x66, 0x43, 0x9e, 0x10, 0xc6, 0x53, 0xf0, 0x75,
0xd6, 0x14, 0x52, 0x0b, 0x97, 0x72, 0x96, 0x99, 0x6c, 0x9e, 0xe9, 0x4c, 0x78, 0x31, 0x1b, 0x76,
0x13, 0xc2, 0x26, 0xdb, 0xd0, 0x1b, 0x82, 0xd3, 0x0d, 0x96, 0xe1, 0x7f, 0xe0, 0xcb, 0x4c, 0x2f,
0x5f, 0x84, 0x4f, 0xf2, 0x8e, 0x60, 0x04, 0xee, 0xab, 0xdc, 0x8a, 0x0e, 0x69, 0x06, 0xa2, 0x80,
0x8e, 0x5e, 0xd6, 0xe5, 0x3a, 0x97, 0x22, 0x20, 0x75, 0x4f, 0xf1, 0x1c, 0xd0, 0xc2, 0xf9, 0x62,
0xb3, 0x5a, 0xc9, 0xa6, 0x55, 0x9f, 0x52, 0x84, 0x14, 0xfa, 0x6b, 0x9d, 0xf1, 0xc1, 0xc0, 0x01,
0xf4, 0xf6, 0xf1, 0x32, 0xfb, 0x78, 0x57, 0x95, 0x00, 0x8a, 0xfe, 0xb1, 0xea, 0x94, 0x44, 0xbc,
0x84, 0x93, 0x7d, 0xac, 0x91, 0xad, 0xac, 0xf2, 0xb9, 0x56, 0xa5, 0x2c, 0x5b, 0xf1, 0x9b, 0xd2,
0xff, 0xac, 0x99, 0x90, 0x97, 0x92, 0xd5, 0x1f, 0x80, 0x97, 0x3e, 0xcd, 0x6e, 0x30, 0x00, 0xef,
0x7a, 0x94, 0x8e, 0xa2, 0x5f, 0x06, 0xcd, 0x1e, 0x1e, 0xef, 0x22, 0x86, 0x21, 0xf0, 0xc9, 0x28,
0x9d, 0xdc, 0x47, 0x4e, 0xff, 0x8b, 0x01, 0xbf, 0x6d, 0xb2, 0x52, 0x1e, 0x4a, 0x65, 0xc7, 0xa5,
0xee, 0x1e, 0xa4, 0xaa, 0x83, 0xc4, 0x32, 0x3c, 0x83, 0xc0, 0x9c, 0xe6, 0x17, 0x54, 0xb7, 0x9b,
0x1c, 0xb8, 0x1d, 0xcb, 0xa3, 0x5b, 0xec, 0x58, 0x34, 0x00, 0x3f, 0x1e, 0xc0, 0x9c, 0x2a, 0x17,
0x7e, 0xec, 0x9a, 0x01, 0x76, 0x6c, 0xdc, 0x7d, 0x86, 0x5a, 0x55, 0x85, 0xde, 0x54, 0x95, 0x7c,
0x5b, 0xf8, 0xb4, 0xca, 0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x1b, 0xbb, 0x28, 0x14,
0x02, 0x00, 0x00,
// 332 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x51, 0xcd, 0x4a, 0xc3, 0x40,
0x10, 0x76, 0xf3, 0xd3, 0xa6, 0x63, 0x2d, 0x71, 0x45, 0x19, 0x7a, 0x0a, 0x01, 0xa1, 0x17, 0x3d,
0xe8, 0x13, 0xb4, 0x5a, 0x45, 0xa4, 0x52, 0x97, 0x5e, 0xf4, 0x52, 0x52, 0xb3, 0x0d, 0x8b, 0x26,
0x0d, 0xc9, 0x16, 0xad, 0x2f, 0xe5, 0x33, 0xf8, 0x66, 0xb2, 0xd3, 0x6d, 0xa0, 0x78, 0xda, 0xef,
0x8f, 0x99, 0xe5, 0x1b, 0xe8, 0xe4, 0x75, 0x76, 0x59, 0x56, 0x2b, 0xbd, 0x8a, 0x7f, 0x1d, 0xf0,
0x27, 0x9b, 0x49, 0x9d, 0xf1, 0x1e, 0x38, 0x2a, 0x45, 0x16, 0xb1, 0x41, 0x47, 0x38, 0x2a, 0xe5,
0x1c, 0x3c, 0xbd, 0x29, 0x25, 0x3a, 0x11, 0x1b, 0xf8, 0x82, 0x30, 0x3f, 0x83, 0x96, 0x4e, 0xaa,
0x4c, 0x6a, 0x74, 0x29, 0x67, 0x99, 0xc9, 0xa6, 0x89, 0x4e, 0xd0, 0x8b, 0xd8, 0xa0, 0x2b, 0x08,
0x9b, 0x6c, 0x45, 0x3b, 0xd0, 0xa7, 0x09, 0x96, 0xf1, 0x10, 0xdc, 0x77, 0xb9, 0xc1, 0x36, 0x89,
0x06, 0x72, 0x84, 0xb6, 0x7e, 0x2b, 0xf3, 0x55, 0x2a, 0x31, 0x20, 0x75, 0x47, 0xf9, 0x05, 0x70,
0x0b, 0xe7, 0x8b, 0xf5, 0x72, 0x29, 0xab, 0x5a, 0x7d, 0x4b, 0xec, 0x50, 0xe8, 0xd8, 0x3a, 0xa3,
0xc6, 0xe0, 0xe7, 0xd0, 0xdb, 0xc5, 0xf3, 0xe4, 0xeb, 0x53, 0x15, 0x08, 0x14, 0x3d, 0xb2, 0xea,
0x84, 0x44, 0x7e, 0x05, 0xa7, 0xbb, 0x58, 0x25, 0x6b, 0x59, 0xa4, 0x73, 0xad, 0x72, 0x99, 0xd7,
0x78, 0x48, 0xe9, 0x13, 0x6b, 0x0a, 0xf2, 0x66, 0x64, 0xc5, 0x7d, 0xf0, 0x66, 0x2f, 0xd3, 0x31,
0x0f, 0xc0, 0xbb, 0x1d, 0xce, 0x86, 0xe1, 0x81, 0x41, 0xd3, 0x87, 0xa7, 0xfb, 0x90, 0xc5, 0x3f,
0x0c, 0xfc, 0xbb, 0x2a, 0xc9, 0x65, 0xd3, 0x19, 0xdb, 0xef, 0x6c, 0xbb, 0x85, 0x9a, 0x0c, 0x84,
0x65, 0xbc, 0x0f, 0x81, 0x79, 0xcd, 0x6a, 0x6a, 0xd3, 0x15, 0x0d, 0xb7, 0xb7, 0xf0, 0x68, 0x8a,
0xbd, 0x05, 0xf5, 0xeb, 0xef, 0xf7, 0x6b, 0x5e, 0x95, 0x62, 0x2b, 0x72, 0x4d, 0xbf, 0x5b, 0x16,
0xc7, 0xff, 0x7e, 0xda, 0x06, 0x57, 0x8c, 0x9f, 0x43, 0x66, 0xc0, 0xf0, 0xe6, 0x31, 0x74, 0x46,
0xdd, 0x57, 0x28, 0x55, 0x91, 0xe9, 0x75, 0x51, 0xc8, 0x8f, 0x45, 0x8b, 0x0e, 0x73, 0xfd, 0x17,
0x00, 0x00, 0xff, 0xff, 0x6c, 0xfe, 0x5f, 0xc5, 0x17, 0x02, 0x00, 0x00,
}

View File

@ -4,7 +4,6 @@ message MyMsg {
enum TYPE {
DATA = 0;
PING = 1;
CATCH = 2;
}
string id = 1;
@ -12,7 +11,6 @@ message MyMsg {
string target = 3;
bytes data = 4;
int32 rproto = 5;
int32 catch = 6;
int32 key = 7;
int32 tcpmode = 8;
int32 tcpmode_buffersize = 9;
@ -21,6 +19,12 @@ message MyMsg {
}
message Frame {
enum TYPE {
DATA = 0;
REQ = 1;
ACK = 2;
}
int32 type = 1;
bool resend = 2;
int64 sendtime = 3;

View File

@ -17,7 +17,7 @@ import (
)
func sendICMP(id int, sequence int, conn icmp.PacketConn, server *net.IPAddr, target string,
connId string, msgType uint32, data []byte, sproto int, rproto int, catch int, key int,
connId string, msgType uint32, data []byte, sproto int, rproto int, key int,
tcpmode int, tcpmode_buffer_size int, tcpmode_maxwin int, tcpmode_resend_time int) {
m := &MyMsg{
@ -26,7 +26,6 @@ func sendICMP(id int, sequence int, conn icmp.PacketConn, server *net.IPAddr, ta
Target: target,
Data: data,
Rproto: (int32)(rproto),
Catch: (int32)(catch),
Key: (int32)(key),
Tcpmode: (int32)(tcpmode),
TcpmodeBuffersize: (int32)(tcpmode_buffer_size),
@ -135,20 +134,7 @@ func GetMd5String(s string) string {
return hex.EncodeToString(h.Sum(nil))
}
type CatchMsg struct {
conn *ServerConn
id string
src *net.IPAddr
data []byte
}
const (
FRAME_MAX_SIZE int = 888
FRAME_MAX_ID int = 999
)
const (
FRAME_TYPE_DATA int = 0x0101
FRAME_TYPE_REQ int = 0x0202
FRAME_TYPE_ACK int = 0x0303
)

View File

@ -27,9 +27,6 @@ type Server struct {
sendPacketSize uint64
recvPacketSize uint64
sendCatchPacket uint64
recvCatchPacket uint64
echoId int
echoSeq int
}
@ -43,8 +40,6 @@ type ServerConn struct {
activeTime time.Time
close bool
rproto int
catch int
catchQueue chan *CatchMsg
}
func (p *Server) Run() {
@ -89,7 +84,7 @@ func (p *Server) processPacket(packet *Packet) {
t.UnmarshalBinary(packet.my.Data)
loggo.Info("ping from %s %s %d %d %d", packet.src.String(), t.String(), packet.my.Rproto, packet.echoId, packet.echoSeq)
sendICMP(packet.echoId, packet.echoSeq, *p.conn, packet.src, "", "", (uint32)(MyMsg_PING), packet.my.Data,
(int)(packet.my.Rproto), -1, 0, p.key,
(int)(packet.my.Rproto), -1, p.key,
0, 0, 0, 0)
return
}
@ -117,10 +112,8 @@ func (p *Server) processPacket(packet *Packet) {
return
}
catchQueue := make(chan *CatchMsg, packet.my.Catch)
localConn = &ServerConn{tcpconn: targetConn, tcpaddrTarget: ipaddrTarget, id: id, activeTime: now, close: false,
rproto: (int)(packet.my.Rproto), catchQueue: catchQueue}
rproto: (int)(packet.my.Rproto)}
p.localConnMap[id] = localConn
@ -141,10 +134,8 @@ func (p *Server) processPacket(packet *Packet) {
return
}
catchQueue := make(chan *CatchMsg, packet.my.Catch)
localConn = &ServerConn{conn: targetConn, ipaddrTarget: ipaddrTarget, id: id, activeTime: now, close: false,
rproto: (int)(packet.my.Rproto), catchQueue: catchQueue}
rproto: (int)(packet.my.Rproto)}
p.localConnMap[id] = localConn
@ -153,20 +144,6 @@ func (p *Server) processPacket(packet *Packet) {
}
localConn.activeTime = now
localConn.catch = (int)(packet.my.Catch)
if packet.my.Type == (int32)(MyMsg_CATCH) {
select {
case re := <-localConn.catchQueue:
sendICMP(packet.echoId, packet.echoSeq, *p.conn, re.src, "", re.id, (uint32)(MyMsg_CATCH), re.data,
re.conn.rproto, -1, 0, p.key,
0, 0, 0, 0)
p.sendCatchPacket++
case <-time.After(time.Duration(1) * time.Millisecond):
}
p.recvCatchPacket++
return
}
if packet.my.Type == (int32)(MyMsg_DATA) {
@ -207,16 +184,9 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) {
now := time.Now()
conn.activeTime = now
if conn.catch > 0 {
select {
case conn.catchQueue <- &CatchMsg{conn: conn, id: id, src: src, data: bytes[:n]}:
case <-time.After(time.Duration(10) * time.Millisecond):
}
} else {
sendICMP(p.echoId, p.echoSeq, *p.conn, src, "", id, (uint32)(MyMsg_DATA), bytes[:n],
conn.rproto, -1, 0, p.key,
conn.rproto, -1, p.key,
0, 0, 0, 0)
}
p.sendPacket++
p.sendPacketSize += (uint64)(n)
@ -248,16 +218,9 @@ func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) {
now := time.Now()
conn.activeTime = now
if conn.catch > 0 {
select {
case conn.catchQueue <- &CatchMsg{conn: conn, id: id, src: src, data: bytes[:n]}:
case <-time.After(time.Duration(10) * time.Millisecond):
}
} else {
sendICMP(p.echoId, p.echoSeq, *p.conn, src, "", id, (uint32)(MyMsg_DATA), bytes[:n],
conn.rproto, -1, 0, p.key,
conn.rproto, -1, p.key,
0, 0, 0, 0)
}
p.sendPacket++
p.sendPacketSize += (uint64)(n)
@ -290,12 +253,10 @@ func (p *Server) checkTimeoutConn() {
}
func (p *Server) showNet() {
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s sendCatch %d/s recvCatch %d/s",
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024, p.sendCatchPacket, p.recvCatchPacket)
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s",
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024)
p.sendPacket = 0
p.recvPacket = 0
p.sendPacketSize = 0
p.recvPacketSize = 0
p.sendCatchPacket = 0
p.recvCatchPacket = 0
}