forked from quic-go/quic-go
add support for multiple udp connections per server
This commit is contained in:
22
server.go
22
server.go
@@ -20,7 +20,8 @@ type PacketHandler interface {
|
|||||||
|
|
||||||
// A Server of QUIC
|
// A Server of QUIC
|
||||||
type Server struct {
|
type Server struct {
|
||||||
conn *net.UDPConn
|
conns []*net.UDPConn
|
||||||
|
connsMutex sync.Mutex
|
||||||
|
|
||||||
signer crypto.Signer
|
signer crypto.Signer
|
||||||
scfg *handshake.ServerConfig
|
scfg *handshake.ServerConfig
|
||||||
@@ -58,19 +59,22 @@ func (s *Server) ListenAndServe(address string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.conn, err = net.ListenUDP("udp", addr)
|
conn, err := net.ListenUDP("udp", addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
s.connsMutex.Lock()
|
||||||
|
s.conns = append(s.conns, conn)
|
||||||
|
s.connsMutex.Unlock()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
data := make([]byte, protocol.MaxPacketSize)
|
data := make([]byte, protocol.MaxPacketSize)
|
||||||
n, remoteAddr, err := s.conn.ReadFromUDP(data)
|
n, remoteAddr, err := conn.ReadFromUDP(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
data = data[:n]
|
data = data[:n]
|
||||||
if err := s.handlePacket(s.conn, remoteAddr, data); err != nil {
|
if err := s.handlePacket(conn, remoteAddr, data); err != nil {
|
||||||
utils.Errorf("error handling packet: %s", err.Error())
|
utils.Errorf("error handling packet: %s", err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,7 +82,15 @@ func (s *Server) ListenAndServe(address string) error {
|
|||||||
|
|
||||||
// Close the server
|
// Close the server
|
||||||
func (s *Server) Close() error {
|
func (s *Server) Close() error {
|
||||||
return s.conn.Close()
|
s.connsMutex.Lock()
|
||||||
|
defer s.connsMutex.Unlock()
|
||||||
|
for _, c := range s.conns {
|
||||||
|
err := c.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) handlePacket(conn *net.UDPConn, remoteAddr *net.UDPAddr, packet []byte) error {
|
func (s *Server) handlePacket(conn *net.UDPConn, remoteAddr *net.UDPAddr, packet []byte) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user