mirror of
https://github.com/ericyan/shield.git
synced 2025-12-24 13:37:51 +08:00
Add transport interface and its UDP implementation
This commit is contained in:
21
transport/conn.go
Normal file
21
transport/conn.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package transport
|
||||
|
||||
import "net"
|
||||
|
||||
// Conn represents a generic network connection.
|
||||
type Conn interface {
|
||||
// Read reads data from the connection.
|
||||
Read(b []byte) (n int, err error)
|
||||
|
||||
// Write writes data to the connection.
|
||||
Write(b []byte) (n int, err error)
|
||||
|
||||
// Close closes the connection.
|
||||
Close() error
|
||||
|
||||
// LocalAddr returns the local network address.
|
||||
LocalAddr() net.Addr
|
||||
|
||||
// RemoteAddr returns the remote network address.
|
||||
RemoteAddr() net.Addr
|
||||
}
|
||||
61
transport/udp/udp.go
Normal file
61
transport/udp/udp.go
Normal file
@@ -0,0 +1,61 @@
|
||||
// Package udp provides transport over UDP.
|
||||
package udp
|
||||
|
||||
import "net"
|
||||
|
||||
// Conn implements the transport.Conn interface for UDP.
|
||||
type Conn struct {
|
||||
localAddr *net.UDPAddr
|
||||
remoteAddr *net.UDPAddr
|
||||
*net.UDPConn
|
||||
}
|
||||
|
||||
// New creates a connection with the remote peer over UDP.
|
||||
func New(local, remote string) (*Conn, error) {
|
||||
localAddr, err := net.ResolveUDPAddr("udp", local)
|
||||
if nil != err {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
remoteAddr, err := net.ResolveUDPAddr("udp", remote)
|
||||
if nil != err {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
conn, err := net.ListenUDP("udp", localAddr)
|
||||
if nil != err {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Conn{localAddr, remoteAddr, conn}, nil
|
||||
}
|
||||
|
||||
// Read reads data from the peer.
|
||||
func (c *Conn) Read(b []byte) (int, error) {
|
||||
n, addr, err := c.ReadFromUDP(b)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Discard packets not from the peer
|
||||
if addr.String() != c.remoteAddr.String() {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Write writes data to the peer.
|
||||
func (c *Conn) Write(b []byte) (int, error) {
|
||||
return c.WriteToUDP(b, c.remoteAddr)
|
||||
}
|
||||
|
||||
// LocalAddr returns the local network address.
|
||||
func (c *Conn) LocalAddr() net.Addr {
|
||||
return c.localAddr
|
||||
}
|
||||
|
||||
// RemoteAddr returns the remote network address.
|
||||
func (c *Conn) RemoteAddr() net.Addr {
|
||||
return c.remoteAddr
|
||||
}
|
||||
Reference in New Issue
Block a user