github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/net/acceptor_windows.go (about)

     1  // +build windows
     2  
     3  package net
     4  
     5  import (
     6  	"github.com/klauspost/crc32"
     7  	"time"
     8  
     9  	"github.com/angenalZZZ/gofunc/net/pool/bytebuffer"
    10  )
    11  
    12  // hashCode hashes a string to a unique hashcode.
    13  func hashCode(s string) int {
    14  	v := int(crc32.ChecksumIEEE([]byte(s)))
    15  	if v >= 0 {
    16  		return v
    17  	}
    18  	return -v
    19  }
    20  
    21  func (svr *server) listenerRun() {
    22  	var err error
    23  	defer func() { svr.signalShutdown(err) }()
    24  	var packet [0x10000]byte
    25  	for {
    26  		if svr.ln.pconn != nil {
    27  			// Read data from UDP socket.
    28  			n, addr, e := svr.ln.pconn.ReadFrom(packet[:])
    29  			if e != nil {
    30  				err = e
    31  				return
    32  			}
    33  			buf := bytebuffer.Get()
    34  			_, _ = buf.Write(packet[:n])
    35  
    36  			el := svr.subEventLoopSet.next(hashCode(addr.String()))
    37  			el.ch <- &udpIn{newUDPConn(el, svr.ln.lnaddr, addr, buf)}
    38  		} else {
    39  			// Accept TCP socket.
    40  			conn, e := svr.ln.ln.Accept()
    41  			if e != nil {
    42  				err = e
    43  				return
    44  			}
    45  			el := svr.subEventLoopSet.next(hashCode(conn.RemoteAddr().String()))
    46  			c := newTCPConn(conn, el)
    47  			el.ch <- c
    48  			go func() {
    49  				var packet [0x10000]byte
    50  				for {
    51  					n, err := c.conn.Read(packet[:])
    52  					if err != nil {
    53  						_ = c.conn.SetReadDeadline(time.Time{})
    54  						el.ch <- &stderr{c, err}
    55  						return
    56  					}
    57  					buf := bytebuffer.Get()
    58  					_, _ = buf.Write(packet[:n])
    59  					el.ch <- &tcpIn{c, buf}
    60  				}
    61  			}()
    62  		}
    63  	}
    64  }