Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
maotama-server
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
maotama-server
Commits
66cb6bd3
Commit
66cb6bd3
authored
Sep 30, 2020
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
test replace packets
parent
4f209e64
Pipeline
#839
passed with stage
in 4 minutes and 6 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
59 additions
and
51 deletions
+59
-51
main.go
main.go
+59
-51
No files found.
main.go
View file @
66cb6bd3
package
main
import
(
"bytes"
"encoding/binary"
"fmt"
"log"
...
...
@@ -14,6 +15,8 @@ import (
var
IP
=
os
.
Getenv
(
"ADDRESS"
)
var
IPinObject
=
net
.
ParseIP
(
IP
)
// funcs from shitama
func
UDPAddrToSockAddr
(
addr
*
net
.
UDPAddr
)
[]
byte
{
...
...
@@ -41,67 +44,60 @@ func SockAddrToUDPAddr(buf []byte) *net.UDPAddr {
}
func
PackData
(
addr
*
net
.
UDPAddr
,
data
[]
byte
)
[]
byte
{
buf
:=
make
([]
byte
,
len
(
data
)
+
6
)
copy
(
buf
[
:
4
],
addr
.
IP
[
len
(
addr
.
IP
)
-
4
:
])
binary
.
BigEndian
.
PutUint16
(
buf
[
4
:
6
],
uint16
(
addr
.
Port
))
copy
(
buf
[
6
:
],
data
)
return
buf
}
func
UnpackData
(
buf
[]
byte
)
(
addr
*
net
.
UDPAddr
,
data
[]
byte
)
{
addr
=
new
(
net
.
UDPAddr
)
addr
.
IP
=
make
([]
byte
,
16
)
addr
.
IP
[
10
]
=
255
addr
.
IP
[
11
]
=
255
copy
(
addr
.
IP
[
len
(
addr
.
IP
)
-
4
:
],
buf
[
:
4
])
addr
.
Port
=
int
(
binary
.
BigEndian
.
Uint16
(
buf
[
4
:
6
]))
data
=
make
([]
byte
,
len
(
buf
)
-
6
)
copy
(
data
,
buf
[
6
:
])
return
addr
,
data
}
func
UDPAddrToSockAddr2
(
addr
*
net
.
UDPAddr
,
outBuf
[]
byte
)
[]
byte
{
func
translateGuestToHostPackets
(
data
*
([]
byte
),
len
int
,
list
*
(
map
[
string
]
*
net
.
UDPAddr
))
{
if
(
*
data
)[
0
]
==
0x1
{
if
len
<
34
{
return
}
if
bytes
.
Compare
((
*
data
)[
1
:
17
],
(
*
data
)[
17
:
33
])
!=
0
{
binary
.
BigEndian
.
PutUint16
(
outBuf
[
:
2
],
0x200
)
binary
.
BigEndian
.
PutUint16
(
outBuf
[
2
:
4
],
uint16
(
addr
.
Port
))
copy
(
outBuf
[
4
:
8
],
addr
.
IP
[
len
(
addr
.
IP
)
-
4
:
])
src
:=
SockAddrToUDPAddr
((
*
data
)[
17
:
25
])
dest
:=
(
*
list
)[
src
.
String
()]
return
outBuf
if
dest
!=
nil
{
copy
((
*
data
)[
17
:
],
UDPAddrToSockAddr
(
dest
))
log
.
Println
(
"Translated g-to-h 0x1 packet success:"
,
src
.
String
(),
dest
.
String
())
}
else
{
log
.
Println
(
"Translated g-to-h 0x1 packet failed:"
,
src
.
String
())
}
}
}
}
func
PackData2
(
addr
*
net
.
UDPAddr
,
data
[]
byte
,
outBuf
[]
byte
)
[]
byte
{
func
translateHostToGuestPackets
(
data
*
([]
byte
),
len
int
,
list
*
(
map
[
string
]
*
net
.
UDPAddr
))
{
if
(
*
data
)[
0
]
==
0x8
{
len
:=
int
(
binary
.
LittleEndian
.
Uint32
((
*
data
)[
1
:
5
]))
copy
(
outBuf
[
:
4
],
addr
.
IP
[
len
(
addr
.
IP
)
-
4
:
])
binary
.
BigEndian
.
PutUint16
(
outBuf
[
4
:
6
],
uint16
(
addr
.
Port
))
copy
(
outBuf
[
6
:
],
data
)
for
i
:=
0
;
i
<
len
;
i
++
{
return
outBuf
}
src
:=
SockAddrToUDPAddr
((
*
data
)[
5
+
i
*
16
:
])
dest
:=
(
*
list
)[
src
.
String
()]
func
UnpackData2
(
buf
[]
byte
)
(
addr
*
net
.
UDPAddr
,
data
[]
byte
)
{
if
dest
!=
nil
{
copy
((
*
data
)[
5
+
i
*
16
:
],
UDPAddrToSockAddr
(
dest
))
log
.
Println
(
"Translated h-to-g 0x8 packet success:"
,
src
.
String
(),
dest
.
String
())
}
else
{
log
.
Println
(
"Translated h-to-g 0x8 packet failed:"
,
src
.
String
())
}
addr
=
new
(
net
.
UDPAddr
)
addr
.
IP
=
make
([]
byte
,
16
)
addr
.
IP
[
10
]
=
255
addr
.
IP
[
11
]
=
255
copy
(
addr
.
IP
[
len
(
addr
.
IP
)
-
4
:
],
buf
[
:
4
])
addr
.
Port
=
int
(
binary
.
BigEndian
.
Uint16
(
buf
[
4
:
6
]))
}
}
if
(
*
data
)[
0
]
==
0x2
{
return
addr
,
buf
[
6
:
]
src
:=
SockAddrToUDPAddr
((
*
data
)[
1
:
])
dest
:=
(
*
list
)[
src
.
String
()]
if
dest
!=
nil
{
copy
((
*
data
)[
1
:
],
UDPAddrToSockAddr
(
dest
))
log
.
Println
(
"Translated h-to-g 0x2 packet success:"
,
src
.
String
(),
dest
.
String
())
}
else
{
log
.
Println
(
"Translated h-to-g 0x2 packet failed:"
,
src
.
String
())
}
}
}
func
transferHostTrafficToGuest
(
host
*
net
.
UDPConn
,
guest
*
net
.
UDPConn
,
guestAddr
*
net
.
UDPAddr
)
{
func
transferHostTrafficToGuest
(
host
*
net
.
UDPConn
,
guest
*
net
.
UDPConn
,
guestAddr
*
net
.
UDPAddr
,
htogAddressTranslateList
*
(
map
[
string
]
*
net
.
UDPAddr
),
hostRemoteAddr
*
net
.
UDPAddr
)
{
buffer
:=
make
([]
byte
,
2048
)
for
{
derr
:=
host
.
SetReadDeadline
(
time
.
Now
()
.
Add
(
2
*
time
.
Minute
))
...
...
@@ -116,8 +112,9 @@ func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr
}
guest
.
WriteToUDP
(
buffer
[
:
length
],
guestAddr
)
}
(
*
htogAddressTranslateList
)[
hostRemoteAddr
.
String
()]
=
nil
}
func
transferGuestTrafficToHost
(
host
*
net
.
UDPConn
,
hostAddr
*
net
.
UDPAddr
,
guestAddr
*
net
.
UDPAddr
,
channel
chan
GuestToHostMessage
,
plist
*
(
map
[
string
]
chan
GuestToHostMessage
))
{
func
transferGuestTrafficToHost
(
host
*
net
.
UDPConn
,
hostAddr
*
net
.
UDPAddr
,
guestAddr
*
net
.
UDPAddr
,
channel
chan
GuestToHostMessage
,
plist
*
(
map
[
string
]
chan
GuestToHostMessage
)
,
gtohAddressTranslateList
*
(
map
[
string
]
*
net
.
UDPAddr
)
)
{
for
{
exit
:=
false
select
{
...
...
@@ -138,6 +135,7 @@ func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, guestA
}
}
(
*
plist
)[
guestAddr
.
String
()]
=
nil
(
*
gtohAddressTranslateList
)[
guestAddr
.
String
()]
=
nil
}
type
GuestToHostMessage
struct
{
...
...
@@ -152,6 +150,8 @@ func listenUDP(ws *websocket.Conn) {
return
}
guestChannelList
:=
make
(
map
[
string
]
chan
GuestToHostMessage
)
htogAddressTranslateList
:=
make
(
map
[
string
]
*
net
.
UDPAddr
)
gtohAddressTranslateList
:=
make
(
map
[
string
]
*
net
.
UDPAddr
)
reply
:=
fmt
.
Sprintf
(
"LISTEN %s:%d"
,
IP
,
guest
.
LocalAddr
()
.
(
*
net
.
UDPAddr
)
.
Port
)
ws
.
Write
([]
byte
(
reply
))
...
...
@@ -189,10 +189,18 @@ func listenUDP(ws *websocket.Conn) {
reply
=
fmt
.
Sprintf
(
"CONNECTED %s:%d"
,
IP
,
host
.
LocalAddr
()
.
(
*
net
.
UDPAddr
)
.
Port
)
ws
.
Write
([]
byte
(
reply
))
host
.
WriteToUDP
(
message
[
:
length
],
hostAddr
)
go
transferHostTrafficToGuest
(
host
,
guest
,
guestAddr
)
hostRemoteAddr
:=
new
(
net
.
UDPAddr
)
hostRemoteAddr
.
IP
=
IPinObject
hostRemoteAddr
.
Port
=
host
.
LocalAddr
()
.
(
*
net
.
UDPAddr
)
.
Port
htogAddressTranslateList
[
hostRemoteAddr
.
String
()]
=
guestAddr
gtohAddressTranslateList
[
guestAddr
.
String
()]
=
hostRemoteAddr
go
transferHostTrafficToGuest
(
host
,
guest
,
guestAddr
,
&
htogAddressTranslateList
,
hostRemoteAddr
)
channel
:=
make
(
chan
GuestToHostMessage
)
guestChannelList
[
guestAddr
.
String
()]
=
channel
go
transferGuestTrafficToHost
(
host
,
hostAddr
,
guestAddr
,
channel
,
&
guestChannelList
)
go
transferGuestTrafficToHost
(
host
,
hostAddr
,
guestAddr
,
channel
,
&
guestChannelList
,
&
gtohAddressTranslateList
)
}
else
{
msg
:=
GuestToHostMessage
{
data
:
message
[
:
length
],
exit
:
false
}
channel
<-
msg
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment