Skip to content

Commit c4b9a6c

Browse files
committed
finish the server
0 parents  commit c4b9a6c

File tree

4 files changed

+229
-0
lines changed

4 files changed

+229
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# 内网穿透工具

client/client.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"net"
6+
)
7+
8+
var (
9+
host string
10+
localPort int
11+
remotePort int
12+
)
13+
14+
func init() {
15+
flag.StringVar(&host, "h", "127.0.0.1", "remote server ip")
16+
flag.IntVar(&localPort, "l", 8080, "the local port")
17+
flag.IntVar(&remotePort, "r", 3333, "remote server port")
18+
}
19+
20+
type server struct {
21+
conn net.Conn
22+
// 数据传输通道
23+
read chan []byte
24+
write chan []byte
25+
// 异常退出通道
26+
exit chan error
27+
}
28+
29+
type local struct {
30+
conn net.Conn
31+
// 数据传输通道
32+
read chan []byte
33+
write chan []byte
34+
// 有异常退出通道
35+
exit chan error
36+
}
37+
38+
func main() {
39+
flag.Parse()
40+
41+
}

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module github.com/pibigstar/go-proxy
2+
3+
go 1.13

server/server.go

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"io"
7+
"net"
8+
"time"
9+
)
10+
11+
var (
12+
localPort int
13+
remotePort int
14+
reConnChan = make(chan bool)
15+
)
16+
17+
func init() {
18+
flag.IntVar(&localPort, "l", 5200, "the user link port")
19+
flag.IntVar(&remotePort, "r", 3333, "client listen port")
20+
}
21+
22+
type client struct {
23+
conn net.Conn
24+
// 数据传输通道
25+
read chan []byte
26+
write chan []byte
27+
// 异常退出通道
28+
exit chan error
29+
}
30+
31+
func (c *client) Read() {
32+
_ = c.conn.SetReadDeadline(time.Now().Add(time.Second * 5))
33+
for {
34+
data := make([]byte, 10240)
35+
36+
_, err := c.conn.Read(data)
37+
if err != nil && err != io.EOF {
38+
c.exit <- err
39+
reConnChan <- true
40+
}
41+
c.read <- data[:]
42+
}
43+
}
44+
45+
func (c *client) Write() {
46+
for {
47+
select {
48+
case data := <-c.write:
49+
_, err := c.conn.Write(data)
50+
if err != nil && err != io.EOF {
51+
c.exit <- err
52+
reConnChan <- true
53+
}
54+
}
55+
}
56+
}
57+
58+
type user struct {
59+
conn net.Conn
60+
// 数据传输通道
61+
read chan []byte
62+
write chan []byte
63+
// 异常退出通道
64+
exit chan error
65+
}
66+
67+
func (u *user) Read() {
68+
_ = u.conn.SetReadDeadline(time.Now().Add(time.Second * 200))
69+
for {
70+
data := make([]byte, 10240)
71+
_, err := u.conn.Read(data)
72+
if err != nil && err != io.EOF {
73+
u.exit <- err
74+
reConnChan <- true
75+
}
76+
u.read <- data[:]
77+
}
78+
}
79+
80+
func (u *user) Write() {
81+
for {
82+
select {
83+
case data := <-u.write:
84+
_, err := u.conn.Write(data)
85+
if err != nil && err != io.EOF {
86+
u.exit <- err
87+
reConnChan <- true
88+
}
89+
}
90+
}
91+
}
92+
93+
func main() {
94+
flag.Parse()
95+
96+
defer func() {
97+
err := recover()
98+
if err != nil {
99+
fmt.Println(err)
100+
}
101+
}()
102+
103+
clientListener, err := net.Listen("tcp", fmt.Sprintf(":%d", remotePort))
104+
if err != nil {
105+
panic(err)
106+
}
107+
fmt.Printf("监听:%d端口, 等待client连接... \n", remotePort)
108+
109+
userListener, err := net.Listen("tcp", fmt.Sprintf(":%d", localPort))
110+
if err != nil {
111+
panic(err)
112+
}
113+
fmt.Printf("监听:%d端口, 等待user连接.... \n", localPort)
114+
115+
userConnChan := make(chan net.Conn)
116+
go AcceptUserConn(userListener, userConnChan)
117+
118+
// 有Client来连接了
119+
clientConn, err := clientListener.Accept()
120+
if err != nil {
121+
panic(err)
122+
}
123+
124+
client := &client{
125+
conn: clientConn,
126+
read: make(chan []byte),
127+
write: make(chan []byte),
128+
exit: make(chan error),
129+
}
130+
131+
go client.Read()
132+
go client.Write()
133+
134+
for {
135+
select {
136+
case userConn := <-userConnChan:
137+
user := &user{
138+
conn: userConn,
139+
read: make(chan []byte),
140+
write: make(chan []byte),
141+
exit: make(chan error),
142+
}
143+
go handle(client, user)
144+
case <-reConnChan:
145+
fmt.Println("重新监听连接")
146+
go AcceptUserConn(userListener, userConnChan)
147+
}
148+
}
149+
150+
}
151+
152+
// 将两个Socket通道链接
153+
// 1. 将从user收到的信息发给client
154+
// 2. 将从client收到信息发给user
155+
func handle(client *client, user *user) {
156+
for {
157+
select {
158+
case userRecv := <-user.read:
159+
fmt.Println("收到从user发来的信息")
160+
client.write <- userRecv
161+
case clientRecv := <-client.read:
162+
fmt.Println("收到从client发来的信息")
163+
user.write <- clientRecv
164+
case err := <-client.exit:
165+
fmt.Println(err.Error())
166+
_ = client.conn.Close()
167+
_ = user.conn.Close()
168+
case err := <-user.exit:
169+
fmt.Println(err.Error())
170+
_ = client.conn.Close()
171+
_ = user.conn.Close()
172+
}
173+
}
174+
}
175+
176+
// 等待user连接
177+
func AcceptUserConn(userListener net.Listener, connChan chan net.Conn) {
178+
userConn, err := userListener.Accept()
179+
if err != nil {
180+
panic(err)
181+
}
182+
fmt.Println("有user来连接...")
183+
connChan <- userConn
184+
}

0 commit comments

Comments
 (0)