https://github.com/hslam/netpoll
Package netpoll implements a network poller based on epoll/kqueue.
https://github.com/hslam/netpoll
epoll event-driven fast go golang kqueue net netpoll networking non-blocking rescheduling sendfile splice unix
Last synced: 8 months ago
JSON representation
Package netpoll implements a network poller based on epoll/kqueue.
- Host: GitHub
- URL: https://github.com/hslam/netpoll
- Owner: hslam
- License: mit
- Created: 2020-08-13T04:25:01.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-11-14T13:04:04.000Z (about 2 years ago)
- Last Synced: 2025-03-30T11:32:44.105Z (9 months ago)
- Topics: epoll, event-driven, fast, go, golang, kqueue, net, netpoll, networking, non-blocking, rescheduling, sendfile, splice, unix
- Language: Go
- Homepage:
- Size: 368 KB
- Stars: 55
- Watchers: 3
- Forks: 14
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# netpoll
[](https://pkg.go.dev/github.com/hslam/netpoll)
[](https://github.com/hslam/netpoll/actions)
[](https://codecov.io/gh/hslam/netpoll)
[](https://goreportcard.com/report/github.com/hslam/netpoll)
[](https://github.com/hslam/netpoll/blob/master/LICENSE)
Package netpoll implements a network poller based on epoll/kqueue.
## Features
* Epoll/kqueue
* TCP/UNIX
* Compatible with the net.Conn interface.
* Upgrade connection
* Non-blocking I/O
* [Splice](https://github.com/hslam/splice "splice")/[sendfile](https://github.com/hslam/sendfile "sendfile")
* Rescheduling workers
**Comparison to other packages.**
|Package| [net](https://github.com/golang/go/tree/master/src/net "net")| [netpoll](https://github.com/hslam/netpoll "netpoll")|[gnet](https://github.com/panjf2000/gnet "gnet")|[evio](https://github.com/tidwall/evio "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|
## [Benchmark](http://github.com/hslam/netpoll-benchmark "netpoll-benchmark")


## Get started
### Install
```
go get github.com/hslam/netpoll
```
### Import
```
import "github.com/hslam/netpoll"
```
### Usage
#### Simple Example
```go
package main
import "github.com/hslam/netpoll"
func main() {
var handler = &netpoll.DataHandler{
NoShared: true,
NoCopy: true,
BufferSize: 1024,
HandlerFunc: func(req []byte) (res []byte) {
res = req
return
},
}
if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
panic(err)
}
}
```
#### [TLS](http://github.com/hslam/socket "socket") Example
```go
package main
import (
"crypto/tls"
"github.com/hslam/netpoll"
"github.com/hslam/socket"
"net"
)
func main() {
var handler = &netpoll.DataHandler{
NoShared: true,
NoCopy: true,
BufferSize: 1024,
HandlerFunc: func(req []byte) (res []byte) {
res = req
return
},
}
handler.SetUpgrade(func(conn net.Conn) (net.Conn, error) {
tlsConn := tls.Server(conn, socket.DefalutTLSConfig())
if err := tlsConn.Handshake(); err != nil {
return nil, err
}
return tlsConn, nil
})
if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
panic(err)
}
}
```
#### [Websocket](http://github.com/hslam/websocket "websocket") Example
```go
package main
import (
"github.com/hslam/netpoll"
"github.com/hslam/websocket"
"net"
)
func main() {
var handler = &netpoll.ConnHandler{}
handler.SetUpgrade(func(conn net.Conn) (netpoll.Context, error) {
return websocket.Upgrade(conn, nil)
})
handler.SetServe(func(context netpoll.Context) error {
ws := context.(*websocket.Conn)
msg, err := ws.ReadMessage()
if err != nil {
return err
}
return ws.WriteMessage(msg)
})
if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
panic(err)
}
}
```
#### [HTTP](http://github.com/hslam/rum "rum") Example
```go
package main
import (
"bufio"
"github.com/hslam/mux"
"github.com/hslam/netpoll"
"github.com/hslam/response"
"net"
"net/http"
"sync"
)
func main() {
m := mux.New()
m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
})
ListenAndServe(":8080", m)
}
func ListenAndServe(addr string, handler http.Handler) error {
var h = &netpoll.ConnHandler{}
type Context struct {
reader *bufio.Reader
rw *bufio.ReadWriter
conn net.Conn
serving 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)
if err != nil {
ctx.serving.Unlock()
return err
}
res := response.NewResponse(req, ctx.conn, ctx.rw)
handler.ServeHTTP(res, req)
res.FinishRequest()
ctx.serving.Unlock()
response.FreeResponse(res)
return nil
})
return netpoll.ListenAndServe("tcp", addr, h)
}
```
### License
This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)
### Author
netpoll was written by Meng Huang.