【发布时间】:2021-02-09 02:24:26
【问题描述】:
# go version
go version go1.13.9 linux/amd64
# uname -a
Linux iZ8vbaym9jmge8qd5hlcpiZ 4.15.0-111-generic #112-Ubuntu SMP Thu Jul 9 20:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
http服务器如下:
package main
import (
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
_ "net/http/pprof"
)
func main() {
h2 := func(w http.ResponseWriter, _ *http.Request) {
time.Sleep(2 * time.Second)
fmt.Println("555555")
if _, err := w.Write(make([]byte, 9999)); err != nil {
fmt.Println("---=====: ", err.Error(), syscall.EPIPE == err)
return
}
}
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
http.HandleFunc("/endpoint", h2)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGPIPE)
go func() {
sig := <-sigs
fmt.Println("6666666666", sig.String())
fmt.Println(sig)
}()
log.Fatal(http.ListenAndServe(":8888", nil))
}
1、通过unix域套接字
卷曲请求 curl 127.0.0.1:8888/endpoint -m 0.2
结果:
555555
---=====: write tcp 127.0.0.1:8888->127.0.0.1:33794: write: broken pipe false
6666666666 broken pipe
broken pipe
2、通过tcp套接字
卷曲请求: curl 47.92.3.20:8888/endpoint -m 0.2
得到结果:555555
go 的 netpoll 是否以不同的方式处理 unix domain socket 和 tcp socket?我看不出 netpoll 代码有什么不同。
【问题讨论】: