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 }