/
kcp_server.go
116 lines (98 loc) · 2.62 KB
/
kcp_server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package protocol
import (
"crypto/md5"
"crypto/sha1"
"flag"
"fmt"
"log"
"net"
"time"
"golang.org/x/crypto/pbkdf2"
"github.com/xtaci/kcp-go/v5"
)
func KCPServer() {
key := pbkdf2.Key(GlobalConfig.SecretKey, GlobalConfig.SecretSalt, 1024, 32, sha1.New)
block, _ := kcp.NewSalsa20BlockCrypt(key)
//block, _ := kcp.NewNoneBlockCrypt(nil)
listener, err := kcp.ListenWithOptions(GlobalConfig.ListenAddr, block, 10, 3)
if err != nil {
log.Printf("Listen failed:%v\n", err)
return
}
log.Printf("Ready for connecting.\n")
for {
client, err := listener.AcceptKCP()
if err != nil {
log.Printf("Accept error:" + err.Error())
continue
}
remoteAddr := client.RemoteAddr().String()
remoteNetwork := client.RemoteAddr().Network()
log.Printf("Connection from: [%s]%s\n", remoteNetwork, remoteAddr)
go HandleEcho(client)
}
}
func HandleEcho(client net.Conn) {
buf := make([]byte, 2048)
for {
n, err := client.Read(buf)
if err != nil {
log.Printf("Read error:" + err.Error())
return
}
log.Printf("Receive Message:%s", buf[:n])
_, err = client.Write(buf[:n])
if err != nil {
log.Printf("Write error:" + err.Error())
return
}
}
}
func KCPClient() {
key := pbkdf2.Key(GlobalConfig.SecretKey, GlobalConfig.SecretSalt, 1024, 32, sha1.New)
block, _ := kcp.NewSalsa20BlockCrypt(key)
//block, _ := kcp.NewNoneBlockCrypt(nil)
sess, err := kcp.DialWithOptions(GlobalConfig.ListenAddr, block, 10, 3)
if err != nil {
log.Printf("Dial error:%+v\n", err)
return
}
for i := 0; i < 10; i++ {
data := time.Now().String()
log.Printf("【send】:%s", data)
_, err := sess.Write([]byte(data))
if err != nil {
log.Printf("Write error:" + err.Error())
return
}
buf := make([]byte, 2048)
// Read will block until Buffer full or Newline(\n)
n, err := sess.Read(buf)
if err != nil {
log.Printf("Read error:" + err.Error())
return
}
log.Printf("【recv】:%s", buf[:n])
time.Sleep(time.Second)
}
}
func KCPDemo() {
listenAddr := flag.String("listenAddr", "127.0.0.1:8976", "listen addr")
role := flag.String("role", "server", "serve role: server or client")
secretKey := flag.String("secret", "", "secret key")
flag.Parse()
if *secretKey == "" {
fmt.Printf("Please sepcify a secret.\n")
return
}
GlobalConfig.ListenAddr = *listenAddr
GlobalConfig.SecretKey = []byte(fmt.Sprintf("%x", md5.Sum([]byte(*secretKey))))
GlobalConfig.SecretSalt = []byte(fmt.Sprintf("%x", sha1.Sum([]byte(*secretKey))))
if *role == "client" {
fmt.Printf("[%s]Connect to:%s\n", *role, *listenAddr)
KCPClient()
} else {
fmt.Printf("[%s]Listen on:%s\n", *role, *listenAddr)
KCPServer()
}
}