github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/00_net/tcp/epoll/main.go (about) 1 //+build ignore 2 3 package epoll 4 5 import ( 6 "log" 7 "net" 8 "net/http" 9 ) 10 11 var epoller *epoll 12 13 func main() { 14 //setLimit() 15 ln, err := net.Listen("tcp", ":8972") 16 if err != nil { 17 panic(err) 18 } 19 go func() { 20 if err := http.ListenAndServe(":6060", nil); err != nil { 21 log.Fatalf("pprof failed: %v", err) 22 } 23 }() 24 epoller, err = MkEpoll() 25 if err != nil { 26 panic(err) 27 } 28 go start() 29 for { 30 conn, e := ln.Accept() 31 if e != nil { 32 if ne, ok := e.(net.Error); ok && ne.Temporary() { 33 log.Printf("accept temp err: %v", ne) 34 continue 35 } 36 log.Printf("accept err: %v", e) 37 return 38 } 39 if err := epoller.Add(conn); err != nil { 40 log.Printf("failed to add connection %v", err) 41 conn.Close() 42 } 43 } 44 } 45 func start() { 46 var buf = make([]byte, 8) 47 for { 48 connections, err := epoller.Wait() 49 if err != nil { 50 log.Printf("failed to epoll wait %v", err) 51 continue 52 } 53 for _, conn := range connections { 54 if conn == nil { 55 break 56 } 57 if _, err := conn.Read(buf); err != nil { 58 if err := epoller.Remove(conn); err != nil { 59 log.Printf("failed to remove %v", err) 60 } 61 conn.Close() 62 } 63 } 64 } 65 }