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
|
package main
import (
"io"
"log"
"net"
"github.com/gorilla/websocket"
)
func wsReader(wsconn *websocket.Conn, out chan []byte) {
for {
messageType, p, err := wsconn.ReadMessage()
if err != nil {
log.Printf("error: wsReader: %s", err)
return
}
if messageType != websocket.BinaryMessage {
log.Println("error: wsReader: only binary messages are supported")
continue
}
out <- p
}
}
func socketReader(proxyconn net.Conn, out chan []byte) {
for {
readBuffer := make([]byte, 2048)
i, err := proxyconn.Read(readBuffer)
if err != nil {
if err == io.EOF {
log.Println("info: socketReader: Disconnected")
} else {
log.Printf("error: socketReader: %s", err)
}
return
}
out <- readBuffer[:i]
}
}
func serviceBoth(wsconn *websocket.Conn, proxyconn net.Conn) {
sc := make(chan []byte)
wsc := make(chan []byte)
go socketReader(proxyconn, sc)
go wsReader(wsconn, wsc)
for {
select {
case sd := <-sc:
if err := wsconn.WriteMessage(websocket.BinaryMessage, sd); err != nil {
log.Printf("error: serviceBoth: %s", err)
return
}
case wsd := <-wsc:
if _, err := proxyconn.Write(wsd); err != nil {
log.Printf("error: serviceBoth: %s", err)
return
}
}
}
}
|