Connection reset by peer
网络编程中某一端可能会产生Connection reset by peer
的报错,这是因为收到了对端发送的RST包。RST包是在tcp异常关闭时发出的,产生的情形很多。 我在写cat-agent 也遇到了这个报错,经排查发现是客户端发送数据后没有读取服务端的响应而直接关闭了连接(之所以不读取就关闭是因为客户端为提高发送效率不care服务端返回,后来为避免大量的RST包选择服务端不回包来解决)
EPOLL_CLOEXEC
epoll_create1()
flags中有个EPOLL_CLOEXEC
,类似的还有open()
函数的O_CLOEXEC
,它们的用处在于:当父进程fork出子进程之后,子进程会继承父进程的文件描述符,当子进程执行exec
系统调用之后保存文件描述符的变量就不存在了,这些继承过来的文件描述符将无法关闭。 xxx_CLOEXEC
选项就可以标识当子进程执行exec
系统调用之后就内核自动关闭继承过来的文件描述符。
syscall.Forklock
在go标准库和其他一些网络库创建socket通常会有如下的代码: syscall.ForkLock.RLock() s, err = socketFunc(family, sotype, proto) if err == nil { syscall.CloseOnExec(s) } syscall.ForkLock.RUnlock()
syscall.CloseOnExec(s)
与上一节的xxx_CLOEXEC
选项作用的相同的。这里ForkLock的作用是保证fork操作时socket的创建与设置CloseOnExec
原子性。