Go语言中怎么开启TCPkeepalive-创新互联
这篇文章将为大家详细讲解有关Go语言中怎么开启TCPkeepalive,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
成都创新互联公司-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、四川乐山服务器托管、等保安全、私有云建设等企业级互联网基础服务,咨询热线:18982081108TCP-keepalive — 一个轻量级的 ping
TCP keepalive发送没有(或者几乎没有)包体负载的 TCP 报文给对端,并且对端会回复 keepaliveACK确认包。它不是 TCP 标准的一部分(尽管在RFC1122[4]描述的这样。
# Idle timecat /proc/sys/net/ipv4/tcp_keepalive_time# Retry intervalcat /proc/sys/net/ipv4/tcp_keepalive_intvl# Ping amountcat /proc/sys/net/ipv4/tcp_keepalive_probes
在 Go 语言中如何设置?
由于我最近使用 Go 语言比较多,我需要在 Go 语言中运用 TCP keepalive。
讨论开始之前需要说明,以下内容适用于 Linux。我不是百分百确定它是否适用于 OSX,但我几乎可以肯定它不适用于 Windows。
连接的特殊类型
首先,我注意到我在服务端程序中只使用了net.Conn[6]类型。
这意味着,我们需要使用ListenTCP[8]而不是Listen[10](它们的调用方式有区别,ListenTCP使用结构体而不是字符串来表示地址。我们调用方式大概会像这样:ListenTCP("tcp", &net.TCPAddr{Port: myClientPort})。如果你不特别指定的话,IP 的默认值为0.0.0.0)。之后它会返回我们需要的类型TCPConn。
Go 语言提供的方法
如果你翻看文档可能会注意到这两个相关的方法:SetKeepAlive[12]。func (c *TCPConn) SetKeepAlive(keepalive bool) error的调用方式十分简单:传入true从而打开 TCP keepalive 机制。
但是接下来的func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error就有些令人困惑了。我们用它究竟设置的是什么?答案可以在这篇文章[14]函数调用。我们来看它的实现。
func (f *File) Fd() uintptr { if f == nil { return ^(uintptr(0)) } // If we put the file descriptor into nonblocking mode, // then set it to blocking mode before we return it, // because historically we have always returned a descriptor // opened in blocking mode. The File will continue to work, // but any blocking operation will tie up a thread. if f.nonblock { f.pfd.SetBlocking() } return uintptr(f.pfd.Sysfd)}
如果文件描述符处于非阻塞模式,会将它修改为阻塞模式。根据stackoverflow 的这个回答[16],它使得你可以获取RawConn
文章名称:Go语言中怎么开启TCPkeepalive-创新互联
文章链接:http://myzitong.com/article/dpijji.html