Golang socket数据结构

丁凯 · · 57 次点击 · · 开始浏览    

编程接口

func Listen(net, laddr string) (Listener, error) 
func (*TCPListener) Accept (c Conn, err error) 
func (c *conn) Read(b []byte) (int, error) 
func (c *conn) Write(b []byte) (int, error) 

内部数据结构

Listener与TCPListener

简单来说,一个是接口,一个是具体实现。因为golang支持tcp、udp等各种协议,天然使用golang的interface。

Listener定义了针对socket操作的各种接口:

type Listener interface {
    Accept() (c Conn, err error)
    Close() error
    Addr() Addr 
}

TCPListener则定义了tcp协议需要使用的数据结构

type TCPListener struct { 
    fd *netFD
}

netFD是golang网络库最核心数据结构,贯穿了golang网络库的所有API,它对底层的socket进行封装,屏蔽了不同os的网络实现。我们接下来会单独分析该数据结构。TCPListener中的fd是与监听套接字关联的socket。

Conn和TCPConn

Conn与TCPConn的关系类似Listener与TCPListener。也是抽象与具象的关系。

type TCPConn struct { 
    conn
}

type conn struct { 
    fd *netFD
}

netFD

这个结构太关键了,说它是golang网络库最核心数据结构一点也不为过。所有golang网络接口最终都会转化为对该结构的方法。

// Network file descriptor. 
type netFD struct { 
    // 不太明白这个mutex的作用 
    fdmu fdMutex

    // 该socket相关的fd 
    sysfd       int 
    family      int 
    sotype      int 
    isConnected bool 
    net         string

    laddr       Addr

    raddr       Addr

    // wait server 
    // 与epoll相关结构 
    pd pollDesc
}

而这个结构中最重要的又是最后一个成员pd,golang网络库实现高并发全靠它了。

type pollDesc struct { 
    runtimeCtx uintptr
}

大致梳理了golang网络库中的几个基本数据结构,接下来我们就可以深入到内部实现流程了。

本文来自:知乎专栏

感谢作者:丁凯

查看原文:Golang socket数据结构

57 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传