Skip to content

Commit 93ef80f

Browse files
committed
Make UDP conn duplex
1 parent b7543ce commit 93ef80f

File tree

5 files changed

+52
-10
lines changed

5 files changed

+52
-10
lines changed

client/client.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"io"
77
"net"
88
"p2p-port-forward/constants"
9-
"p2p-port-forward/utils"
109
"p2p-port-forward/logger"
10+
"p2p-port-forward/utils"
1111
)
1212

1313
var log = logger.Logger
@@ -56,6 +56,8 @@ func (c *Client) listenUDP() func() (net.Conn, error) {
5656
return func() (net.Conn, error) {
5757
addr, _ := net.ResolveUDPAddr(c.networkProto.GetName(), fmt.Sprintf(":%s", c.port))
5858
fmt.Println("Listening....")
59-
return net.ListenUDP(c.networkProto.GetName(), addr)
59+
conn, err := net.ListenUDP(c.networkProto.GetName(), addr)
60+
return &utils.DuplexUDPConnection{UDPConn: conn}, err
61+
6062
}
6163
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"io"
77
"p2p-port-forward/client"
88
"p2p-port-forward/logger"
9-
"p2p-port-forward/utils"
109
"p2p-port-forward/server"
10+
"p2p-port-forward/utils"
1111
)
1212

1313
var (

server/server.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package server
22

33
import (
4-
"io"
4+
"fmt"
55
"github.com/selvakn/libzt"
6+
"io"
67
"net"
78
"p2p-port-forward/constants"
8-
"p2p-port-forward/utils"
9-
"fmt"
109
"p2p-port-forward/logger"
10+
"p2p-port-forward/utils"
1111
)
1212

1313
var log = logger.Logger

utils/duplex_udp_connection.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package utils
2+
3+
import (
4+
"net"
5+
"time"
6+
)
7+
8+
type DuplexUDPConnection struct {
9+
UDPConn *net.UDPConn
10+
rUDPAddr *net.UDPAddr
11+
}
12+
13+
func (c *DuplexUDPConnection) Read(b []byte) (n int, err error) {
14+
len, rUDPAddr, err := c.UDPConn.ReadFromUDP(b)
15+
c.rUDPAddr = rUDPAddr
16+
return len, err
17+
}
18+
19+
func (c *DuplexUDPConnection) Write(b []byte) (n int, err error) {
20+
return c.UDPConn.WriteToUDP(b, c.rUDPAddr)
21+
}
22+
23+
func (c *DuplexUDPConnection) Close() error { return c.UDPConn.Close() }
24+
func (c *DuplexUDPConnection) LocalAddr() net.Addr { return c.UDPConn.LocalAddr() }
25+
func (c *DuplexUDPConnection) RemoteAddr() net.Addr { return c.UDPConn.RemoteAddr() }
26+
func (c *DuplexUDPConnection) SetDeadline(t time.Time) error { return c.UDPConn.SetDeadline(t) }
27+
func (c *DuplexUDPConnection) SetReadDeadline(t time.Time) error { return c.UDPConn.SetReadDeadline(t) }
28+
func (c *DuplexUDPConnection) SetWriteDeadline(t time.Time) error { return c.UDPConn.SetReadDeadline(t) }

utils/io.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,22 @@ func Sync(stream1 func() (net.Conn, error), stream2 func() (net.Conn, error), li
2929

3030
func sync(source1 io.ReadWriteCloser, source2 io.ReadWriteCloser) {
3131
go func() {
32-
defer source2.Close()
33-
defer source1.Close()
32+
defer closeAll(source2, source1)
3433

35-
io.Copy(source2, source1)
34+
_, err := io.Copy(source2, source1)
35+
if err != nil {
36+
log.Error(err)
37+
}
3638
}()
37-
io.Copy(source1, source2)
39+
_, err := io.Copy(source1, source2)
40+
if err != nil {
41+
log.Error(err)
42+
}
43+
}
44+
45+
func closeAll(sources ...io.Closer) {
46+
log.Info("Closing all connections")
47+
for _, source := range sources {
48+
source.Close()
49+
}
3850
}

0 commit comments

Comments
 (0)