mirror of
https://github.com/ehang-io/nps.git
synced 2025-09-07 07:38:23 +00:00
add new file
This commit is contained in:
71
transport/quic.go
Normal file
71
transport/quic.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package transport
|
||||
|
||||
import (
|
||||
"context"
|
||||
quic "github.com/lucas-clemente/quic-go"
|
||||
"net"
|
||||
)
|
||||
|
||||
type QUIC struct {
|
||||
session quic.Session
|
||||
}
|
||||
|
||||
func NewQUIC(serverSession quic.Session) *QUIC {
|
||||
return &QUIC{
|
||||
session: serverSession,
|
||||
}
|
||||
}
|
||||
|
||||
func (qu *QUIC) Server() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (qu *QUIC) Accept() (net.Conn, error) {
|
||||
s, err := qu.session.AcceptStream(context.Background())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
|
||||
}
|
||||
|
||||
func (qu *QUIC) Addr() net.Addr {
|
||||
return qu.session.LocalAddr()
|
||||
}
|
||||
|
||||
func (qu *QUIC) RemoteAddr() net.Addr {
|
||||
return qu.session.RemoteAddr()
|
||||
}
|
||||
|
||||
func (qu *QUIC) Client() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (qu *QUIC) Open() (net.Conn, error) {
|
||||
s, err := qu.session.OpenStream()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
|
||||
}
|
||||
|
||||
func (qu *QUIC) Close() error {
|
||||
return qu.session.CloseWithError(1, "by npc")
|
||||
}
|
||||
|
||||
type QUICConn struct {
|
||||
quic.Stream
|
||||
localAddr net.Addr
|
||||
remoteAddr net.Addr
|
||||
}
|
||||
|
||||
func NewQUICConn(stream quic.Stream, rd net.Addr, ld net.Addr) *QUICConn {
|
||||
return &QUICConn{Stream: stream, localAddr: ld, remoteAddr: rd}
|
||||
}
|
||||
|
||||
func (qc *QUICConn) LocalAddr() net.Addr {
|
||||
return qc.localAddr
|
||||
}
|
||||
|
||||
func (qc *QUICConn) RemoteAddr() net.Addr {
|
||||
return qc.remoteAddr
|
||||
}
|
17
transport/transport.go
Normal file
17
transport/transport.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package transport
|
||||
|
||||
import (
|
||||
"net"
|
||||
)
|
||||
|
||||
type TunnelType int
|
||||
|
||||
type Conn interface {
|
||||
Server() error
|
||||
Accept() (net.Conn, error)
|
||||
Addr() net.Addr
|
||||
RemoteAddr() net.Addr
|
||||
Client() error
|
||||
Open() (net.Conn, error)
|
||||
Close() error
|
||||
}
|
51
transport/yamux.go
Normal file
51
transport/yamux.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package transport
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/yamux"
|
||||
"net"
|
||||
)
|
||||
|
||||
type YaMux struct {
|
||||
conn net.Conn
|
||||
config *yamux.Config
|
||||
session *yamux.Session
|
||||
}
|
||||
|
||||
func NewYaMux(conn net.Conn, config *yamux.Config) *YaMux {
|
||||
return &YaMux{
|
||||
conn: conn,
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
func (ym *YaMux) Server() error {
|
||||
var err error
|
||||
ym.session, err = yamux.Server(ym.conn, ym.config)
|
||||
return err
|
||||
}
|
||||
|
||||
func (ym *YaMux) Accept() (net.Conn, error) {
|
||||
return ym.session.Accept()
|
||||
}
|
||||
|
||||
func (ym *YaMux) Addr() net.Addr {
|
||||
return ym.conn.LocalAddr()
|
||||
}
|
||||
|
||||
func (ym *YaMux) RemoteAddr() net.Addr {
|
||||
return ym.conn.RemoteAddr()
|
||||
}
|
||||
|
||||
func (ym *YaMux) Client() error {
|
||||
var err error
|
||||
ym.session, err = yamux.Client(ym.conn, ym.config)
|
||||
return err
|
||||
}
|
||||
|
||||
func (ym *YaMux) Open() (net.Conn, error) {
|
||||
return ym.session.Open()
|
||||
}
|
||||
|
||||
func (ym *YaMux) Close() error {
|
||||
return ym.conn.Close()
|
||||
}
|
Reference in New Issue
Block a user