Commit e3f213ef authored by AlexStocks's avatar AlexStocks

add udp server close

parent 55a91868
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
> feature > feature
* 1 add udp client and udp server * 1 add udp client and udp server
> version: 0.8.01
- 2017/05/02 - 2017/05/02
> feature > feature
* 1 set read/write deadline for every read/write action refers to fasthttp * 1 set read/write deadline for every read/write action refers to fasthttp
......
...@@ -44,8 +44,8 @@ const ( ...@@ -44,8 +44,8 @@ const (
type Server struct { type Server struct {
// net // net
addr string addr string
udpConn *net.UDPConn // for udp server pktListener net.PacketConn
listener net.Listener streamListener net.Listener
lock sync.Mutex // for server lock sync.Mutex // for server
typ int typ int
server *http.Server // for ws or wss server server *http.Server // for ws or wss server
...@@ -116,6 +116,7 @@ func (s *Server) stop() { ...@@ -116,6 +116,7 @@ func (s *Server) stop() {
err error err error
ctx context.Context ctx context.Context
) )
select { select {
case <-s.done: case <-s.done:
return return
...@@ -131,10 +132,18 @@ func (s *Server) stop() { ...@@ -131,10 +132,18 @@ func (s *Server) stop() {
log.Error("server shutdown ctx:%#v", err) log.Error("server shutdown ctx:%#v", err)
} }
} }
s.server = nil
s.lock.Unlock() s.lock.Unlock()
// 把listener.Close放在这里,既能防止多次关闭调用, if s.streamListener != nil {
// 把streamListener.Close放在这里,既能防止多次关闭调用,
// 又能及时让Server因accept返回错误而从RunEventloop退出 // 又能及时让Server因accept返回错误而从RunEventloop退出
s.listener.Close() s.streamListener.Close()
s.streamListener = nil
}
if s.pktListener == nil {
s.pktListener.Close()
s.pktListener = nil
}
}) })
} }
} }
...@@ -154,15 +163,15 @@ func (s *Server) IsClosed() bool { ...@@ -154,15 +163,15 @@ func (s *Server) IsClosed() bool {
func (s *Server) listenTCP() error { func (s *Server) listenTCP() error {
var ( var (
err error err error
listener net.Listener streamListener net.Listener
) )
listener, err = net.Listen("tcp", s.addr) streamListener, err = net.Listen("tcp", s.addr)
if err != nil { if err != nil {
return errors.Wrapf(err, "net.Listen(tcp, addr:%s))", s.addr) return errors.Wrapf(err, "net.Listen(tcp, addr:%s))", s.addr)
} }
s.listener = listener s.streamListener = streamListener
return nil return nil
} }
...@@ -171,22 +180,22 @@ func (s *Server) listenUDP() error { ...@@ -171,22 +180,22 @@ func (s *Server) listenUDP() error {
var ( var (
err error err error
localAddr *net.UDPAddr localAddr *net.UDPAddr
udpConn *net.UDPConn pktListener *net.UDPConn
) )
localAddr, err = net.ResolveUDPAddr("udp", s.addr) localAddr, err = net.ResolveUDPAddr("udp", s.addr)
if err != nil { if err != nil {
return errors.Wrapf(err, "net.ResolveUDPAddr(udp, addr:%s)", s.addr) return errors.Wrapf(err, "net.ResolveUDPAddr(udp, addr:%s)", s.addr)
} }
udpConn, err = net.ListenUDP("udp", localAddr) pktListener, err = net.ListenUDP("udp", localAddr)
if err != nil { if err != nil {
return errors.Wrapf(err, "net.ListenUDP((udp, localAddr:%#v)", localAddr) return errors.Wrapf(err, "net.ListenUDP((udp, localAddr:%#v)", localAddr)
} }
if err = setUDPSocketOptions(udpConn); err != nil { if err = setUDPSocketOptions(pktListener); err != nil {
return errors.Wrapf(err, "setUDPSocketOptions(udpConn:%#v)", udpConn) return errors.Wrapf(err, "setUDPSocketOptions(pktListener:%#v)", pktListener)
} }
s.udpConn = udpConn s.pktListener = pktListener
return nil return nil
} }
...@@ -204,7 +213,7 @@ func (s *Server) listen() error { ...@@ -204,7 +213,7 @@ func (s *Server) listen() error {
} }
func (s *Server) accept(newSession NewSessionCallback) (Session, error) { func (s *Server) accept(newSession NewSessionCallback) (Session, error) {
conn, err := s.listener.Accept() conn, err := s.streamListener.Accept()
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -268,7 +277,7 @@ func (s *Server) runUDPEventloop(newSession NewSessionCallback) { ...@@ -268,7 +277,7 @@ func (s *Server) runUDPEventloop(newSession NewSessionCallback) {
ss Session ss Session
) )
ss = NewUDPSession(s.udpConn, nil) ss = NewUDPSession(s.pktListener.(*net.UDPConn), nil)
if err := newSession(ss); err != nil { if err := newSession(ss); err != nil {
panic(err.Error()) panic(err.Error())
} }
...@@ -355,7 +364,7 @@ func (s *Server) runWSEventLoop(newSession NewSessionCallback) { ...@@ -355,7 +364,7 @@ func (s *Server) runWSEventLoop(newSession NewSessionCallback) {
s.lock.Lock() s.lock.Lock()
s.server = server s.server = server
s.lock.Unlock() s.lock.Unlock()
err = server.Serve(s.listener) err = server.Serve(s.streamListener)
if err != nil { if err != nil {
log.Error("http.Server.Serve(addr{%s}) = err{%#v}", s.addr, err) log.Error("http.Server.Serve(addr{%s}) = err{%#v}", s.addr, err)
// panic(err) // panic(err)
...@@ -421,7 +430,7 @@ func (s *Server) runWSSEventLoop(newSession NewSessionCallback) { ...@@ -421,7 +430,7 @@ func (s *Server) runWSSEventLoop(newSession NewSessionCallback) {
s.lock.Lock() s.lock.Lock()
s.server = server s.server = server
s.lock.Unlock() s.lock.Unlock()
err = server.Serve(tls.NewListener(s.listener, config)) err = server.Serve(tls.NewListener(s.streamListener, config))
if err != nil { if err != nil {
log.Error("http.Server.Serve(addr{%s}) = err{%#v}", s.addr, err) log.Error("http.Server.Serve(addr{%s}) = err{%#v}", s.addr, err)
panic(err) panic(err)
...@@ -449,7 +458,7 @@ func (s *Server) RunEventloop(newSession NewSessionCallback) { ...@@ -449,7 +458,7 @@ func (s *Server) RunEventloop(newSession NewSessionCallback) {
} }
func (s *Server) Listener() net.Listener { func (s *Server) Listener() net.Listener {
return s.listener return s.streamListener
} }
func (s *Server) Close() { func (s *Server) Close() {
......
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