- Notifications
You must be signed in to change notification settings - Fork14
Package netpoll implements a network poller based on epoll/kqueue.
License
NotificationsYou must be signed in to change notification settings
hslam/netpoll
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Package netpoll implements a network poller based on epoll/kqueue.
- Epoll/kqueue
- TCP/UNIX
- Compatible with the net.Conn interface.
- Upgrade connection
- Non-blocking I/O
- Splice/sendfile
- Rescheduling workers
Comparison to other packages.
Package | net | netpoll | gnet | evio |
---|---|---|---|---|
Low memory usage | No | Yes | Yes | Yes |
Non-blocking I/O | No | Yes | Yes | Yes |
Splice/sendfile | Yes | Yes | No | No |
Rescheduling | Yes | Yes | No | No |
Compatible with the net.Conn interface | Yes | Yes | No | No |
go get github.com/hslam/netpoll
import "github.com/hslam/netpoll"
package mainimport"github.com/hslam/netpoll"funcmain() {varhandler=&netpoll.DataHandler{NoShared:true,NoCopy:true,BufferSize:1024,HandlerFunc:func(req []byte) (res []byte) {res=reqreturn},}iferr:=netpoll.ListenAndServe("tcp",":9999",handler);err!=nil {panic(err)}}
TLS Example
package mainimport ("crypto/tls""github.com/hslam/netpoll""github.com/hslam/socket""net")funcmain() {varhandler=&netpoll.DataHandler{NoShared:true,NoCopy:true,BufferSize:1024,HandlerFunc:func(req []byte) (res []byte) {res=reqreturn},}handler.SetUpgrade(func(conn net.Conn) (net.Conn,error) {tlsConn:=tls.Server(conn,socket.DefalutTLSConfig())iferr:=tlsConn.Handshake();err!=nil {returnnil,err}returntlsConn,nil})iferr:=netpoll.ListenAndServe("tcp",":9999",handler);err!=nil {panic(err)}}
Websocket Example
package mainimport ("github.com/hslam/netpoll""github.com/hslam/websocket""net")funcmain() {varhandler=&netpoll.ConnHandler{}handler.SetUpgrade(func(conn net.Conn) (netpoll.Context,error) {returnwebsocket.Upgrade(conn,nil)})handler.SetServe(func(context netpoll.Context)error {ws:=context.(*websocket.Conn)msg,err:=ws.ReadMessage()iferr!=nil {returnerr}returnws.WriteMessage(msg)})iferr:=netpoll.ListenAndServe("tcp",":9999",handler);err!=nil {panic(err)}}
HTTP Example
package mainimport ("bufio""github.com/hslam/mux""github.com/hslam/netpoll""github.com/hslam/response""net""net/http""sync")funcmain() {m:=mux.New()m.HandleFunc("/",func(w http.ResponseWriter,r*http.Request) {w.Write([]byte("Hello World"))})ListenAndServe(":8080",m)}funcListenAndServe(addrstring,handler http.Handler)error {varh=&netpoll.ConnHandler{}typeContextstruct {reader*bufio.Readerrw*bufio.ReadWriterconn net.Connserving sync.Mutex}h.SetUpgrade(func(conn net.Conn) (netpoll.Context,error) {reader:=bufio.NewReader(conn)rw:=bufio.NewReadWriter(reader,bufio.NewWriter(conn))return&Context{reader:reader,conn:conn,rw:rw},nil})h.SetServe(func(context netpoll.Context)error {ctx:=context.(*Context)ctx.serving.Lock()req,err:=http.ReadRequest(ctx.reader)iferr!=nil {ctx.serving.Unlock()returnerr}res:=response.NewResponse(req,ctx.conn,ctx.rw)handler.ServeHTTP(res,req)res.FinishRequest()ctx.serving.Unlock()response.FreeResponse(res)returnnil})returnnetpoll.ListenAndServe("tcp",addr,h)}
This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)
netpoll was written by Meng Huang.
About
Package netpoll implements a network poller based on epoll/kqueue.
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published