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  }