【Golang】网络开发:net包(TCP和UDP)

之前写出了2个简单的demo,这里阅读以下完整的手册

基础结构体

type Conn

type Conn interface {
    // Read从连接中读取数据
    // Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
    Read(b []byte) (n int, err error)
    // Write从连接中写入数据
    // Write方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
    Write(b []byte) (n int, err error)
    // Close方法关闭该连接
    // 并会导致任何阻塞中的Read或Write方法不再阻塞并返回错误
    Close() error
    // 返回本地网络地址
    LocalAddr() Addr
    // 返回远端网络地址
    RemoteAddr() Addr
    // 设定该连接的读写deadline,等价于同时调用SetReadDeadline和SetWriteDeadline
    // deadline是一个绝对时间,超过该时间后I/O操作就会直接因超时失败返回而不会阻塞
    // deadline对之后的所有I/O操作都起效,而不仅仅是下一次的读或写操作
    // 参数t为零值表示不设置期限
    SetDeadline(t time.Time) error
    // 设定该连接的读操作deadline,参数t为零值表示不设置期限
    SetReadDeadline(t time.Time) error
    // 设定该连接的写操作deadline,参数t为零值表示不设置期限
    // 即使写入超时,返回值n也可能>0,说明成功写入了部分数据
    SetWriteDeadline(t time.Time) error
}

Conn接口代表通用的面向流的网络连接。多个线程可能会同时调用同一个Conn的方法。

type Listener

type Listener interface {
    // Addr返回该接口的网络地址
    Addr() Addr
    // Accept等待并返回下一个连接到该接口的连接
    Accept() (c Conn, err error)
    // Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。
    Close() error
}

func Listen(net, laddr string) (Listener, error)

返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:

"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。参见Dial函数获取laddr的语法。

TCP

type TCPAddr

type TCPAddr struct {
    IP   IP
    Port int
    Zone string // IPv6范围寻址域
}

TCPAddr代表一个TCP终端地址。

  1. TCPAddr 是一个TCP地址结构体

func ResolveTCPAddr(net, addr string) (*TCPAddr, error)

ResolveTCPAddr将addr作为TCP地址解析并返回。参数addr格式为"host:port"或"[ipv6-host%zone]:port",解析得到网络名和端口名;net必须是"tcp"、"tcp4"或"tcp6"。

IPv6地址字面值/名称必须用方括号包起来,如"[::1]:80"、"[ipv6-host]:http"或"[ipv6-host%zone]:80"。

  1. 使用字符串去创建一个TCP地址结构体

func (a *TCPAddr) Network() string

返回地址的网络类型,"tcp"。

func (a *TCPAddr) String() string

通过地址结构体获取地址

type TCPListener

type TCPListener struct {
    // 内含隐藏或非导出字段
}

TCPListener代表一个TCP网络的监听者。使用者应尽量使用Listener接口而不是假设(网络连接为)TCP。

func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)

ListenTCP在本地TCP地址laddr上声明并返回一个*TCPListener,net参数必须是"tcp"、"tcp4"、"tcp6",如果laddr的端口字段为0,函数将选择一个当前可用的端口,可以用Listener的Addr方法获得该端口。

  1. 用来创建一个TCP监听

func (l *TCPListener) Addr() Addr

Addr返回l监听的的网络地址,一个*TCPAddr。

func (l *TCPListener) SetDeadline(t time.Time) error

设置监听器执行的期限,t为Time零值则会关闭期限限制。

  1. 测试了一下,似乎是在这个时间前没有任何请求,监听器会关闭

func (l *TCPListener) Accept() (Conn, error)

Accept用于实现Listener接口的Accept方法;他会等待下一个呼叫,并返回一个该呼叫的Conn接口。

func (l *TCPListener) AcceptTCP() (*TCPConn, error)

AcceptTCP接收下一个呼叫,并返回一个新的*TCPConn。

func (l *TCPListener) Close() error

Close停止监听TCP地址,已经接收的连接不受影响。

func (l *TCPListener) File() (f *os.File, err error)

File方法返回下层的os.File的副本,并将该副本设置为阻塞模式。

使用者有责任在用完后关闭f。关闭c不影响f,关闭f也不影响c。返回的os.File类型文件描述符和原本的网络连接是不同的。试图使用该副本修改本体的属性可能会(也可能不会)得到期望的效果。

  1. 似乎是用来返回一个原始socket的fd副本的,因为测试时在windows下的,无法执行该方法:file tcp 127.0.0.1:9900: not supported by windows

type TCPConn

type TCPConn struct {
    // 内含隐藏或非导出字段
}

TCPConn代表一个TCP网络连接,实现了Conn接口。

  1. 一个实现了conn基础socket连接结构体的tcp连接结构体

func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)

DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。net必须是"tcp"、"tcp4"、"tcp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。

  1. 用来创建一个tcp客户端,laddr在非需要特殊指定端口的情况下nil就完事了

func (c *TCPConn) LocalAddr() Addr

LocalAddr返回本地网络地址

func (c *TCPConn) RemoteAddr() Addr

RemoteAddr返回远端网络地址

func (c *TCPConn) SetReadBuffer(bytes int) error

SetReadBuffer设置该连接的系统接收缓冲

func (c *TCPConn) SetWriteBuffer(bytes int) error

SetWriteBuffer设置该连接的系统发送缓冲

func (c *TCPConn) SetDeadline(t time.Time) error

SetDeadline设置读写操作期限,实现了Conn接口的SetDeadline方法

func (c *TCPConn) SetReadDeadline(t time.Time) error

SetReadDeadline设置读操作期限,实现了Conn接口的SetReadDeadline方法

func (c *TCPConn) SetWriteDeadline(t time.Time) error

SetWriteDeadline设置写操作期限,实现了Conn接口的SetWriteDeadline方法

func (c *TCPConn) SetKeepAlive(keepalive bool) error

SetKeepAlive设置操作系统是否应该在该连接中发送keepalive信息

func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error

SetKeepAlivePeriod设置keepalive的周期,超出会断开

func (c *TCPConn) SetLinger(sec int) error

SetLinger设定当连接中仍有数据等待发送或接受时的Close方法的行为。

如果sec < 0(默认),Close方法立即返回,操作系统停止后台数据发送;如果 sec == 0,Close立刻返回,操作系统丢弃任何未发送或未接收的数据;如果sec > 0,Close方法阻塞最多sec秒,等待数据发送或者接收,在一些操作系统中,在超时后,任何未发送的数据会被丢弃。

  1. 用来给关闭的socket等待时间的

func (c *TCPConn) SetNoDelay(noDelay bool) error

SetNoDelay设定操作系统是否应该延迟数据包传递,以便发送更少的数据包(Nagle's算法)。默认为真,即数据应该在Write方法后立刻发送。

  1. 延迟收包可以减少交互增加可用性,不过需要处理粘包

func (c *TCPConn) Read(b []byte) (int, error)

Read实现了Conn接口Read方法

func (c *TCPConn) Write(b []byte) (int, error)

Write实现了Conn接口Write方法

func (c *TCPConn) ReadFrom(r io.Reader) (int64, error)

ReadFrom实现了io.ReaderFrom接口的ReadFrom方法

func (c *TCPConn) Close() error

Close关闭连接

func (c *TCPConn) CloseRead() error

CloseRead关闭TCP连接的读取侧(以后不能读取),应尽量使用Close方法。

func (c *TCPConn) CloseWrite() error

CloseWrite关闭TCP连接的写入侧(以后不能写入),应尽量使用Close>方法。

func (c *TCPConn) File() (f *os.File, err error)

File方法设置下层的os.File为阻塞模式并返回其副本。

使用者有责任在用完后关闭f。关闭c不影响f,关闭f也不影响c。返回的os.File类型文件描述符和原本的网络连接是不同的。试图使用该副本修改本体的属性可能会(也可能不会)得到期望的效果。

type UDPConn

type UDPConn struct {
    // 内含隐藏或非导出字段
}

UDPConn代表一个UDP网络连接,实现了Conn和PacketConn接口。

udp没有专门的监听器,所以不存在UDPListener,由于UDP的特性,服务端在写的时候需要WriteTo指定地址

func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error)

DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。net必须是"udp"、"udp4"、"udp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。

func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error)

ListenUDP创建一个接收目的地是本地地址laddr的UDP数据包的网络连接。net必须是"udp"、"udp4"、"udp6";如果laddr端口为0,函数将选择一个当前可用的端口,可以用Listener的Addr方法获得该端口。返回的*UDPConn的ReadFrom和WriteTo方法可以用来发送和接收UDP数据包(每个包都可获得来源地址或设置目标地址)。

func ListenMulticastUDP(net string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error)

ListenMulticastUDP接收目的地是ifi接口上的组地址gaddr的UDP数据包。它指定了使用的接口,如果ifi是nil,将使用默认接口。

func (c *UDPConn) LocalAddr() Addr

LocalAddr返回本地网络地址

func (c *UDPConn) RemoteAddr() Addr

RemoteAddr返回远端网络地址

func (c *UDPConn) SetReadBuffer(bytes int) error

SetReadBuffer设置该连接的系统接收缓冲

func (c *UDPConn) SetWriteBuffer(bytes int) error

SetWriteBuffer设置该连接的系统发送缓冲

func (c *UDPConn) SetDeadline(t time.Time) error

SetDeadline设置读写操作期限,实现了Conn接口的SetDeadline方法

func (c *UDPConn) SetReadDeadline(t time.Time) error

SetReadDeadline设置读操作期限,实现了Conn接口的SetReadDeadline方法

func (c *UDPConn) SetWriteDeadline(t time.Time) error

SetWriteDeadline设置写操作期限,实现了Conn接口的SetWriteDeadline方法

func (c *UDPConn) Read(b []byte) (int, error)

Read实现Conn接口Read方法

func (c *UDPConn) ReadFrom(b []byte) (int, Addr, error)

ReadFrom实现PacketConn接口ReadFrom方法

func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)

ReadFromUDP从c读取一个UDP数据包,将有效负载拷贝到b,返回拷贝字节数和数据包来源地址。

ReadFromUDP方法会在超过一个固定的时间点之后超时,并返回一个错误。

func (c *UDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *UDPAddr, err error)

ReadMsgUDP从c读取一个数据包,将有效负载拷贝进b,相关的带外数据拷贝进oob,返回拷贝进b的字节数,拷贝进oob的字节数,数据包的flag,数据包来源地址和可能的错误。

func (c *UDPConn) Write(b []byte) (int, error)

Write实现Conn接口Write方法

func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error)

WriteTo实现PacketConn接口WriteTo方法

func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)

WriteToUDP通过c向地址addr发送一个数据包,b为包的有效负载,返回写入的字节。

WriteToUDP方法会在超过一个固定的时间点之后超时,并返回一个错误。在面向数据包的连接上,写入超时是十分罕见的。

func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error)

WriteMsgUDP通过c向地址addr发送一个数据包,b和oob分别为包有效负载和对应的带外数据,返回写入的字节数(包数据、带外数据)和可能的错误。

func (c *UDPConn) Close() error

Close关闭连接

func (c *UDPConn) File() (f *os.File, err error)

File方法设置下层的os.File为阻塞模式并返回其副本。

使用者有责任在用完后关闭f。关闭c不影响f,关闭f也不影响c。返回的os.File类型文件描述符和原本的网络连接是不同的。试图使用该副本修改本体的属性可能会(也可能不会)得到期望的效果。

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论