Commit 5a114b60 authored by nanahira's avatar nanahira

add error exit

parent d2dafe18
Pipeline #835 passed with stage
in 4 minutes and 4 seconds
maotama-server
cert
...@@ -100,37 +100,57 @@ func UnpackData2(buf []byte) (addr *net.UDPAddr, data []byte) { ...@@ -100,37 +100,57 @@ func UnpackData2(buf []byte) (addr *net.UDPAddr, data []byte) {
} }
func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, hostAddr *net.UDPAddr, guestAddr *net.UDPAddr) { func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr *net.UDPAddr) {
buffer := make([]byte, 2048) buffer := make([]byte, 2048)
for { for {
length, _, _ := host.ReadFromUDP(buffer) length, _, err := host.ReadFromUDP(buffer)
if err != nil {
log.Println("Host read error: ", err)
break
}
guest.WriteToUDP(buffer[:length], guestAddr) guest.WriteToUDP(buffer[:length], guestAddr)
} }
} }
func transferGuestTrafficToHost(host *net.UDPConn, guest *net.UDPConn, hostAddr *net.UDPAddr, guestAddr *net.UDPAddr, channel chan []byte) { func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, channel chan GuestToHostMessage) {
for { for {
message := <-channel message := <-channel
host.WriteToUDP(message, hostAddr) if message.exit {
break
} else {
host.WriteToUDP(message.data, hostAddr)
}
} }
} }
type GuestToHostMessage struct {
exit bool
data []byte
}
func listenUDP(ws *websocket.Conn) { func listenUDP(ws *websocket.Conn) {
guest, err := net.ListenUDP("udp", nil) guest, err := net.ListenUDP("udp", nil)
if err != nil { if err != nil {
log.Println(err) log.Println("Guest listen error: ", err)
return return
} }
guestChannelList := make(map[string]chan []byte) guestChannelList := make(map[string]chan GuestToHostMessage)
reply := fmt.Sprintf("LISTEN %s:%d", IP, guest.LocalAddr().(*net.UDPAddr).Port) reply := fmt.Sprintf("LISTEN %s:%d", IP, guest.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply)) ws.Write([]byte(reply))
for { for {
message := make([]byte, 2048) message := make([]byte, 2048)
length, guestAddr, _ := guest.ReadFromUDP(message) length, guestAddr, err := guest.ReadFromUDP(message)
channel, ok := guestChannelList[guestAddr.String()] channel, ok := guestChannelList[guestAddr.String()]
if !ok { if err != nil {
log.Println("Guest read error: ", err)
if ok {
channel <- GuestToHostMessage{data: nil, exit: true}
guestChannelList[guestAddr.String()] = nil
}
} else if !ok {
host, err := net.ListenUDP("udp", nil) host, err := net.ListenUDP("udp", nil)
if err != nil { if err != nil {
log.Println(err) log.Println("Host listen error: ", err)
return return
} }
reply = fmt.Sprintf("CONNECT %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port) reply = fmt.Sprintf("CONNECT %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port)
...@@ -139,12 +159,13 @@ func listenUDP(ws *websocket.Conn) { ...@@ -139,12 +159,13 @@ func listenUDP(ws *websocket.Conn) {
reply = fmt.Sprintf("CONNECTED %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port) reply = fmt.Sprintf("CONNECTED %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply)) ws.Write([]byte(reply))
host.WriteToUDP(message[:length], hostAddr) host.WriteToUDP(message[:length], hostAddr)
go transferHostTrafficToGuest(host, guest, hostAddr, guestAddr) go transferHostTrafficToGuest(host, guest, guestAddr)
channel := make(chan []byte) channel := make(chan GuestToHostMessage)
guestChannelList[guestAddr.String()] = channel guestChannelList[guestAddr.String()] = channel
go transferGuestTrafficToHost(host, guest, hostAddr, guestAddr, channel) go transferGuestTrafficToHost(host, hostAddr, channel)
} else { } else {
channel <- message[:length] msg := GuestToHostMessage{data: message[:length], exit: false}
channel <- msg
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment