2019-02-26 14:40:28 +00:00
|
|
|
package mux
|
|
|
|
|
|
|
|
import (
|
2019-10-12 14:56:37 +00:00
|
|
|
"bufio"
|
|
|
|
"fmt"
|
2019-10-21 03:55:29 +00:00
|
|
|
"io"
|
2019-02-26 14:40:28 +00:00
|
|
|
"net"
|
|
|
|
"net/http"
|
2019-10-12 14:56:37 +00:00
|
|
|
"net/http/httputil"
|
2019-02-26 14:40:28 +00:00
|
|
|
_ "net/http/pprof"
|
2019-10-21 03:55:29 +00:00
|
|
|
"strconv"
|
2019-09-11 12:19:14 +00:00
|
|
|
"sync"
|
2019-02-26 14:40:28 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
2019-10-21 03:55:29 +00:00
|
|
|
"unsafe"
|
2019-08-10 03:15:25 +00:00
|
|
|
|
|
|
|
"github.com/astaxie/beego/logs"
|
|
|
|
"github.com/cnlh/nps/lib/common"
|
2019-02-26 14:40:28 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var conn1 net.Conn
|
|
|
|
var conn2 net.Conn
|
|
|
|
|
|
|
|
func TestNewMux(t *testing.T) {
|
|
|
|
go func() {
|
2019-03-15 06:03:49 +00:00
|
|
|
http.ListenAndServe("0.0.0.0:8889", nil)
|
2019-02-26 14:40:28 +00:00
|
|
|
}()
|
|
|
|
logs.EnableFuncCallDepth(true)
|
|
|
|
logs.SetLogFuncCallDepth(3)
|
|
|
|
server()
|
|
|
|
client()
|
|
|
|
time.Sleep(time.Second * 3)
|
|
|
|
go func() {
|
2019-03-29 02:41:57 +00:00
|
|
|
m2 := NewMux(conn2, "tcp")
|
2019-02-26 14:40:28 +00:00
|
|
|
for {
|
2019-10-21 03:55:29 +00:00
|
|
|
//logs.Warn("npc starting accept")
|
2019-02-26 14:40:28 +00:00
|
|
|
c, err := m2.Accept()
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
|
|
|
continue
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
//logs.Warn("npc accept success ")
|
2019-08-30 12:05:09 +00:00
|
|
|
c2, err := net.Dial("tcp", "127.0.0.1:80")
|
2019-08-26 13:42:20 +00:00
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
2019-10-12 14:56:37 +00:00
|
|
|
c.Close()
|
2019-08-30 12:05:09 +00:00
|
|
|
continue
|
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
//c2.(*net.TCPConn).SetReadBuffer(0)
|
|
|
|
//c2.(*net.TCPConn).SetReadBuffer(0)
|
|
|
|
go func(c2 net.Conn, c *conn) {
|
2019-09-24 14:29:31 +00:00
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
_, err = common.CopyBuffer(c2, c)
|
|
|
|
if err != nil {
|
|
|
|
c2.Close()
|
|
|
|
c.Close()
|
2019-10-21 03:55:29 +00:00
|
|
|
logs.Warn("close npc by copy from nps", err, c.connId)
|
2019-09-24 14:29:31 +00:00
|
|
|
}
|
|
|
|
wg.Done()
|
|
|
|
}()
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
_, err = common.CopyBuffer(c, c2)
|
|
|
|
if err != nil {
|
|
|
|
c2.Close()
|
|
|
|
c.Close()
|
2019-10-21 03:55:29 +00:00
|
|
|
logs.Warn("close npc by copy from server", err, c.connId)
|
2019-09-24 14:29:31 +00:00
|
|
|
}
|
|
|
|
wg.Done()
|
|
|
|
}()
|
2019-10-21 03:55:29 +00:00
|
|
|
//logs.Warn("npc wait")
|
2019-09-24 14:29:31 +00:00
|
|
|
wg.Wait()
|
2019-10-21 03:55:29 +00:00
|
|
|
}(c2, c.(*conn))
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
go func() {
|
2019-03-29 02:41:57 +00:00
|
|
|
m1 := NewMux(conn1, "tcp")
|
2019-02-26 14:40:28 +00:00
|
|
|
l, err := net.Listen("tcp", "127.0.0.1:7777")
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
for {
|
2019-10-21 03:55:29 +00:00
|
|
|
//logs.Warn("nps starting accept")
|
|
|
|
conns, err := l.Accept()
|
2019-02-26 14:40:28 +00:00
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
|
|
|
continue
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
//conns.(*net.TCPConn).SetReadBuffer(0)
|
|
|
|
//conns.(*net.TCPConn).SetReadBuffer(0)
|
|
|
|
//logs.Warn("nps accept success starting new conn")
|
2019-08-26 13:42:20 +00:00
|
|
|
tmpCpnn, err := m1.NewConn()
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn("nps new conn err ", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
logs.Warn("nps new conn success ", tmpCpnn.connId)
|
2019-10-21 03:55:29 +00:00
|
|
|
go func(tmpCpnn *conn, conns net.Conn) {
|
2019-09-24 14:29:31 +00:00
|
|
|
go func() {
|
2019-10-21 03:55:29 +00:00
|
|
|
_, err := common.CopyBuffer(tmpCpnn, conns)
|
2019-09-24 14:29:31 +00:00
|
|
|
if err != nil {
|
2019-10-21 03:55:29 +00:00
|
|
|
conns.Close()
|
2019-09-24 14:29:31 +00:00
|
|
|
tmpCpnn.Close()
|
2019-10-21 03:55:29 +00:00
|
|
|
logs.Warn("close nps by copy from user", tmpCpnn.connId, err)
|
2019-09-24 14:29:31 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
//time.Sleep(time.Second)
|
2019-10-21 03:55:29 +00:00
|
|
|
_, err = common.CopyBuffer(conns, tmpCpnn)
|
2019-09-08 15:49:16 +00:00
|
|
|
if err != nil {
|
2019-10-21 03:55:29 +00:00
|
|
|
conns.Close()
|
2019-09-08 15:49:16 +00:00
|
|
|
tmpCpnn.Close()
|
2019-10-21 03:55:29 +00:00
|
|
|
logs.Warn("close nps by copy from npc ", tmpCpnn.connId, err)
|
2019-09-08 15:49:16 +00:00
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
}(tmpCpnn, conns)
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2019-10-15 08:32:21 +00:00
|
|
|
go NewLogServer()
|
2019-10-12 14:56:37 +00:00
|
|
|
time.Sleep(time.Second * 5)
|
2019-10-21 03:55:29 +00:00
|
|
|
//for i:=0;i<1000;i++ {
|
|
|
|
// go test_raw(i)
|
|
|
|
//}
|
2019-10-12 14:56:37 +00:00
|
|
|
|
2019-02-26 14:40:28 +00:00
|
|
|
for {
|
|
|
|
time.Sleep(time.Second * 5)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func server() {
|
|
|
|
var err error
|
|
|
|
l, err := net.Listen("tcp", "127.0.0.1:9999")
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
go func() {
|
|
|
|
conn1, err = l.Accept()
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func client() {
|
|
|
|
var err error
|
|
|
|
conn2, err = net.Dial("tcp", "127.0.0.1:9999")
|
|
|
|
if err != nil {
|
2019-08-30 12:05:09 +00:00
|
|
|
logs.Warn(err)
|
2019-02-26 14:40:28 +00:00
|
|
|
}
|
|
|
|
}
|
2019-03-15 06:03:49 +00:00
|
|
|
|
2019-10-12 14:56:37 +00:00
|
|
|
func test_request() {
|
|
|
|
conn, _ := net.Dial("tcp", "127.0.0.1:7777")
|
|
|
|
for {
|
|
|
|
conn.Write([]byte(`GET /videojs5/video.js HTTP/1.1
|
|
|
|
Host: 127.0.0.1:7777
|
|
|
|
Connection: keep-alive
|
|
|
|
|
|
|
|
|
|
|
|
`))
|
|
|
|
r, err := http.ReadResponse(bufio.NewReader(conn), nil)
|
|
|
|
if err != nil {
|
|
|
|
logs.Warn("close by read response err", err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
logs.Warn("read response success", r)
|
|
|
|
b, err := httputil.DumpResponse(r, true)
|
|
|
|
if err != nil {
|
|
|
|
logs.Warn("close by dump response err", err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fmt.Println(string(b[:20]), err)
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-21 03:55:29 +00:00
|
|
|
func test_raw(k int) {
|
|
|
|
for i := 0; i < 1; i++ {
|
|
|
|
ti := time.Now()
|
|
|
|
conn, _ := net.Dial("tcp", "127.0.0.1:7777")
|
|
|
|
tid := time.Now()
|
|
|
|
conn.Write([]byte(`GET / HTTP/1.1
|
2019-10-12 14:56:37 +00:00
|
|
|
Host: 127.0.0.1:7777
|
|
|
|
|
|
|
|
|
|
|
|
`))
|
2019-10-21 03:55:29 +00:00
|
|
|
tiw := time.Now()
|
|
|
|
buf := make([]byte, 3572)
|
|
|
|
n, err := io.ReadFull(conn, buf)
|
|
|
|
//n, err := conn.Read(buf)
|
2019-10-12 14:56:37 +00:00
|
|
|
if err != nil {
|
|
|
|
logs.Warn("close by read response err", err)
|
|
|
|
break
|
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
//logs.Warn(n, string(buf[:50]), "\n--------------\n", string(buf[n-50:n]))
|
|
|
|
//time.Sleep(time.Second)
|
|
|
|
err = conn.Close()
|
|
|
|
if err != nil {
|
|
|
|
logs.Warn("close conn err ", err)
|
|
|
|
}
|
|
|
|
now := time.Now()
|
|
|
|
du := now.Sub(ti).Seconds()
|
|
|
|
dud := now.Sub(tid).Seconds()
|
|
|
|
duw := now.Sub(tiw).Seconds()
|
|
|
|
if du > 1 {
|
|
|
|
logs.Warn("duration long", du, dud, duw, k, i)
|
|
|
|
}
|
|
|
|
if n != 3572 {
|
|
|
|
logs.Warn("n loss", n, string(buf))
|
|
|
|
}
|
2019-10-12 14:56:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-15 06:03:49 +00:00
|
|
|
func TestNewConn(t *testing.T) {
|
2019-08-30 12:05:09 +00:00
|
|
|
buf := common.GetBufPoolCopy()
|
2019-03-15 06:03:49 +00:00
|
|
|
logs.Warn(len(buf), cap(buf))
|
|
|
|
//b := pool.GetBufPoolCopy()
|
|
|
|
//b[0] = 1
|
|
|
|
//b[1] = 2
|
|
|
|
//b[2] = 3
|
|
|
|
b := []byte{1, 2, 3}
|
|
|
|
logs.Warn(copy(buf[:3], b), len(buf), cap(buf))
|
|
|
|
logs.Warn(len(buf), buf[0])
|
|
|
|
}
|
2019-10-21 03:55:29 +00:00
|
|
|
|
|
|
|
func TestDQueue(t *testing.T) {
|
|
|
|
logs.EnableFuncCallDepth(true)
|
|
|
|
logs.SetLogFuncCallDepth(3)
|
|
|
|
d := new(bufDequeue)
|
|
|
|
d.vals = make([]unsafe.Pointer, 8)
|
|
|
|
go func() {
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
logs.Warn(i)
|
|
|
|
logs.Warn(d.popTail())
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
go func() {
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
data := "test"
|
|
|
|
go logs.Warn(i, unsafe.Pointer(&data), d.pushHead(unsafe.Pointer(&data)))
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
time.Sleep(time.Second * 3)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestChain(t *testing.T) {
|
|
|
|
logs.EnableFuncCallDepth(true)
|
|
|
|
logs.SetLogFuncCallDepth(3)
|
|
|
|
d := new(bufChain)
|
|
|
|
d.new(256)
|
|
|
|
go func() {
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
|
|
unsa, ok := d.popTail()
|
|
|
|
str := (*string)(unsa)
|
|
|
|
if ok {
|
|
|
|
logs.Warn(i, str, *str, ok)
|
|
|
|
} else {
|
|
|
|
logs.Warn("nil", i, ok)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
go func() {
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
|
|
data := "test " + strconv.Itoa(i)
|
|
|
|
logs.Warn(data, unsafe.Pointer(&data))
|
|
|
|
go d.pushHead(unsafe.Pointer(&data))
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
time.Sleep(time.Second * 10)
|
|
|
|
}
|