golang中net包用法(三)--TCP和UDP以及Unix domain socket


type TCPAddr //表示TCP终端地址

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

func ResolveTCPAddr(net,addr string) (*TCPAddr,error)//将一个地址解析成TCP地址形式,形如"host:port"或 "[ipv6-host%zone]:port",解析得到网络域名和端口名.其中net必须是"tcp","tcp4"或者"tcp6",IPv6地址字面值/名称必须用方括号包起来,如"[::1]:80"、"[ipv6-host]:http"或"[ipv6-host%zone]:80".

func (a *TCPAddr) Network() string //返回地址的网络类型,"tcp"

func (a *TCPAddr) String() string


type TCPConn//TCPConn是TCP网络连接,其实现了Conn接口,其中方法大部分与IPConn相同,这里不再赘述.
func DialTCP(net string,laddr,raddr *TCPAddr) (*TCPConn,error)
func (c *TCPConn) Close() error
func (c *TCPConn) CloseRead() error
func (c *TCPConn) CloseWrite() error
func (c *TCPConn) File() (f *os.File,err error)
func (c *TCPConn) LocalAddr() Addr
func (c *TCPConn) Read(b []byte) (int,error)
func (c *TCPConn) ReadFrom(r io.Reader) (int64,error)
func (c *TCPConn) RemoteAddr() Addr
func (c *TCPConn) SetDeadline(t time.Time) error
func (c *TCPConn) SetKeepAlive(keepalive bool) error //设置操作系统是否应该在该连接中发送keepalive信息
func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error //设定keepalive的生存周期
func (c *TCPConn) SetLinger(sec int) error //SetLinger设定一个连接的关闭行为当该连接中仍有数据等待发送或者确认.如果sec<0(认形式),操作系统将在后台完成发送数据操作;如果sec==0,操作系统将任何未发送或者未确认的数据丢弃;当sec>0,数据将在后台进行发送,这点和sec<0时效果一致.然而,在一些操作系统中,当sec秒之后,系统将任何未发送的数据丢弃.
func (c *TCPConn) SetNoDelay(noDelay bool) error//控制是否操作系统为了发送更少的数据包(Nagle's算法)而延迟数据包的发送,认值是true(不延迟),这意味着数据将在写后尽可能快的进行发送,而不是延迟发送.
func (c *TCPConn) SetReadBuffer(bytes int) error //设定操作系统对于conn连接接受缓存的大小
func (c *TCPConn) SetReadDeadline(t time.Time) error//设定读超时时间
func (c *TCPConn) SetWriteBuffer(bytes int) error//设定操作系统对于conn连接发送缓存的大小
func (c *TCPConn) SetWriteDeadline(t time.Time) error//设定发送超时时间
func (c *TCPConn) Write(b []byte) (int,error)//实现了write接口方法


type TCPListener//TCP监听器,客户端应该使用不同类型的监听,而不是认的TCP

func ListenTCP(net string,laddr *TCPAddr) (*TCPListener,error)//声明Tcp地址laddr并且返回一个tcp listener,其中net必须是tcp,tcp4或者tcp6,如果laddr端口是0,则ListenTcp将选择一个可用的端口,调用者可以利用TCPListener的addr方法获取该地址.
func (l *TCPListener) Accept() (Conn,error)//实现listener接口的accept方法,它等待下次调用并返回一个连接
func (l *TCPListener) AcceptTCP() (*TCPConn,error)//接受下一次调用,并返回一个新的连接
func (l *TCPListener) Addr() Addr//返回listener的网络地址,TCPAddr
func (l *TCPListener) Close() error //停止监听TCP地址,已经建立的连接不被关闭

func (l *TCPListener) File() (f *os.File,err error)//返回底层os.File的一个副本,设定为阻塞模式,调用者需要关闭文件当完毕后,关闭l不影响文件副本f,并且关闭文件副本f也不影响tcplistener l,返回的文件句柄不同于原来网络连接的文件,通过这个副本来改变原来的文件属性可能起作用也可能不起作用.

func (l *TCPListener) SetDeadline(t time.Time) error//设定监听者的超时时间,如果时间设置为0,则禁用超时设置,即永远不会超时.


type UDPAddr //代表一个udp端口的地址

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

func ResolveUDPAddr(net,addr string) (*UDPAddr,error) //将addr作为UDP地址解析并返回。参数addr格式为"host:port"或"[ipv6-host%zone]:port",解析得到网络名和端口名;net必须是"udp"、"udp4"或"udp6"。IPv6地址字面值/名称必须用方括号包起来,如"[::1]:80"、"[ipv6-host]:http"或"[ipv6-host%zone]:80"。
func (a *UDPAddr) Network() string//返回地址的网络名"udp"

func (a *UDPAddr) String() string//UDPAddr的字符化形式表示


type UDPConn //实现了udp网络连接,它实现了conn和packetconn的接口
func DialUDP(net string,raddr *UDPAddr) (*UDPConn,error)//连接网络上的远程地址raddr,其中net必须是udp,udp4或者udp6,如果laddr不是空,则使用本地地址用于连接
func ListenMulticastUDP(net string,ifi *Interface,gaddr *UDPAddr) (*UDPConn,error)//监听在ifi的组地址gaddr上的多播udp包,ifi指定了加入的接口,如果ifi是空的话,则使用认的多播接口
func ListenUDP(net string,laddr *UDPAddr) (*UDPConn,error)//监听绑定在本地地址laddr上的udp包,如果laddr是端口0的话,则listenudp将选择一个可用的port端口,使用udpconn的LocalAddr方法能够发现这个port端口,返回的udpconn的ReadFrom和Writeto方法能够用来接受和发送udp包.
func (c *UDPConn) Close() error//关闭连接
func (c *UDPConn) File() (f *os.File,err error)//与TCPConn中File()方法类似
func (c *UDPConn) LocalAddr() Addr//返回本地网络地址
func (c *UDPConn) Read(b []byte) (int,error)
func (c *UDPConn) ReadFrom(b []byte) (int,Addr,error)
func (c *UDPConn) ReadFromUDP(b []byte) (n int,addr *UDPAddr,err error)//从c中读取一个包,将有效负载写入b中返回写入的byte数以及包的地址.ReadFromUdp可以设置为超时.
func (c *UDPConn) ReadMsgUDP(b,oob []byte) (n,oobn,flags int,err error)//ReadMsgUDP从c读取一个数据包,将有效负载拷贝进b,相关的带外数据拷贝进oob,返回拷贝进b的字节数,拷贝进oob的字节数,数据包的flag,数据包来源地址和可能的错误
func (c *UDPConn) RemoteAddr() Addr//返回远程的网络地址
func (c *UDPConn) SetDeadline(t time.Time) error //实现conn的超时方法,设置udpconn的超时
func (c *UDPConn) SetReadBuffer(bytes int) error
func (c *UDPConn) SetReadDeadline(t time.Time) error
func (c *UDPConn) SetWriteBuffer(bytes int) error
func (c *UDPConn) SetWriteDeadline(t time.Time) error
func (c *UDPConn) Write(b []byte) (int,error)
func (c *UDPConn) WriteMsgUDP(b,oob []byte,addr *UDPAddr) (n,oobn int,err error)//WriteMsgUDP通过c向地址addr发送一个数据包,b和oob分别为包有效负载和对应的带外数据,返回写入的字节数(包数据、带外数据)和可能的错误
func (c *UDPConn) Writeto(b []byte,addr Addr) (int,error)

func (c *UDPConn) WritetoUDP(b []byte,addr *UDPAddr) (int,error) //通过c将一个udp包写入addr,其中需要从b中复制有效负载.WritetoUDP也可以设置超时时间


type UnixAddr //代表一个Unix域名的socket终端地址

type UnixAddr struct {
        Name string
        Net  string
}

func ResolveUnixAddr(net,addr string) (*UnixAddr,error) //将addr解析成UnixAddr,net指的是网络名称,为unix,unixgram或者unixpacket
func (a *UnixAddr) Network() string //返回网络名称,unix,unixgram或者unixpacket

func (a *UnixAddr) String() string //UnixAddr的字符形式表示


type UnixConn//UnixConn是Unix域名socket的网络连接
func DialUnix(net string,raddr *UnixAddr) (*UnixConn,error)//在网络协议net上连接本地地址laddr和远端地址raddr.其中net是"unix"、"unixgram"、"unixpacket",如果laddr不是nil将使用它作为本地地址。
func ListenUnixgram(net string,laddr *UnixAddr) (*UnixConn,error)//监听绑定到本地地址laddr的数据包,其中net必须是unixgram,返回连接的ReadFrom和Writeto方法能够用来接受和发送地址包
func (c *UnixConn) Close() error//关闭连接
func (c *UnixConn) CloseRead() error//关闭连接的读操作,大多数情况下使用Close
func (c *UnixConn) CloseWrite() error//关闭连接的写操作,大多数情况下使用Close
func (c *UnixConn) File() (f *os.File,err error)//
func (c *UnixConn) LocalAddr() Addr
func (c *UnixConn) Read(b []byte) (int,error)
func (c *UnixConn) ReadFrom(b []byte) (int,error)
func (c *UnixConn) ReadFromUnix(b []byte) (n int,addr *UnixAddr,err error)
func (c *UnixConn) ReadMsgUnix(b,err error)
func (c *UnixConn) RemoteAddr() Addr
func (c *UnixConn) SetDeadline(t time.Time) error
func (c *UnixConn) SetReadBuffer(bytes int) error
func (c *UnixConn) SetReadDeadline(t time.Time) error
func (c *UnixConn) SetWriteBuffer(bytes int) error
func (c *UnixConn) SetWriteDeadline(t time.Time) error
func (c *UnixConn) Write(b []byte) (int,error)
func (c *UnixConn) WriteMsgUnix(b,addr *UnixAddr) (n,err error)
func (c *UnixConn) Writeto(b []byte,addr Addr) (n int,err error)

func (c *UnixConn) WritetoUnix(b []byte,addr *UnixAddr) (n int,err error)


type UnixListener//表示一个Unix域名socket监听者,客户端应该使用指定的不同类型的listener而不是使用认的unix domain socket
func ListenUnix(net string,laddr *UnixAddr) (*UnixListener,error) //利用Unix domain socket的laddr创建一个unix监听者,这个网络必须是unix或者unixpacket
func (l *UnixListener) Accept() (c Conn,err error)//
func (l *UnixListener) AcceptUnix() (*UnixConn,error)
func (l *UnixListener) Addr() Addr
func (l *UnixListener) Close() error
func (l *UnixListener) File() (f *os.File,err error)
func (l *UnixListener) SetDeadline(t time.Time) (err error)

Bugs

在任何POSIX平台上,使用ReadFrom或ReadFromIP方法从"ip4"网络读取数据时,即使有足够的空间,都可能不会返回完整的IPv4数据包,包括数据包的头域。即使Read或ReadMsgiP方法可以返回完整的数据包,也有可能出现这种情况。因为对go 1的兼容性要求,这个情况无法被修正。因此,如果必须获取完整数据包时,建议不要使用这两个方法,请使用Read或ReadMsgiP代替。

在OpenBSD系统中,在"tcp"网络监听时不会同时监听IPv4和IPv6连接。因为该系统中IPv4通信不会导入IPv6套接字中。如果有必要的话,请使用两个独立的监听。


参考:

http://docscn.studygolang.com/pkg/net/#pkg-constants

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下Go 语言的指针 (Pointer),一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。大致上理解如下: 变量名前的
1、概述 1.1&#160;Protocol buffers定义 Protocol buffers 是语言中立、平台中立、可扩展的结构化数据序列化机制,就像 XML,但是它更小、更快、更简单。你只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,支持各
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat()和os.IsNotExit() func Stat(name string) (FileInfo, error) Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。 func IsNot
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指令集 :&#160;loongarch64 平台 : 龙芯 go版本 :&#160;go version go1.15.6 linux/loong64 2、go和docker安装 docker安装: y
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=12这种写法,这其实是编译器在编译期间自动做了类型推断。编译器会对数据进行类型检查,不同类型的数据不能赋值,不能在函数中传参。强类型语言有一些优势,很多的错误会在编译期间被检查出来,不像php和python等弱类型语言,很多错误只有运
1、概述 在《Golang常用语法糖》这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖。 在介绍Golang接收者方法语法糖前,先简单说下Go 语言的指针 (Pointer),大致上理解如下: 变量名前的 &amp;&#160;符号,是取变量的内存地址,不是取
1、概述 1.1 什么是gRPC RPC的全称是Remote Procedure Call,远程过程调用。RPC是一种协议,它实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。 而gRP
1、概述 在Golang语言中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。 2、Go语言函数变量详解 定义 func fun() { } var f func() f = fun 说明 我们首先定义了一个 fun 的函数,接着我们声明了一个
1、概述 Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。Swagger是目前最受欢迎的RESTful Api文档生成工具之一,主要的原因如下: 跨平台、跨语言的支持 强大的社区 生态圈 Swagger Tools(S
1、 概述 Protocol buffers 是语言中立、平台中立、可扩展的结构化数据序列化机制,就像 XML,但是它更小、更快、更简单。你只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,支持各种语言。因为profobuf是二进制数据格式,需要编码
1、名字由来 语法糖(Syntactic sugar)的概念是由英国计算机科学家彼得&#183;兰丁提出的,用于表示编程语言中的某种类型的语法,这些语法不会影响功能,但使用起来却很方便。语法糖,也称糖语法,这些语法不仅不会影响功能,编译后的结果跟不使用语法糖也一样。语法糖,有可能让代码编写变得简单,
一、for循环 循环:让程序多次执行相同的代码块for循环是Go语言中唯一一个循环结构for循环经典语法先执行表达式1执行表达式2判断是否成立,如果成立执行循环体循环体执行完成后,执行表达式3再次执行表达式2,判断是否成立.for循环用的最多的地方就是遍历数组或切片等 for 表达式1;表达式2;表
1、概述 在Go语言中,函数可以有命名返回值和普通(匿名)返回值。命名返回值会被视为定义在函数顶部的变量,并且在使用 return 语句返回时,不再必须在其后面指定参数名,也就是支持“裸”返回;而使用普通返回值时,使用 return 语句返回时,需要在其后面指定与普通返回值相同类型的参数名。 实际上
1、概述 sync.Once&#160;是 Golang package 中使方法只执行一次的对象实现,作用与&#160;init&#160;函数类似。但也有所不同。 init&#160;函数是在文件包首次被加载的时候执行,且只执行一次 sync.Once是在代码运行中需要的时候执行,且只执行一次
1、概述 gRPC常用于服务端之间的相互调用,如果想把服务暴露给前端,虽然动手修改服务端也能实现,但似乎增加了不少工作量,此时还可以选择gRPC-Gateway方式来快速将gRPC服务以http的方式暴露出来; gRPC-Gateway 是 Google protocol buffers compi
1、初识 errgroup WaitGroup 主要用于控制任务组下的并发子任务。它的具体做法就是,子任务 goroutine 执行前通过 Add 方法添加任务数目,子任务 goroutine 结束时调用 Done 标记已完成任务数,主任务 goroutine 通过 Wait 方法等待所有的任务完成
在 Golang 里,&#160;_&#160;(下划线)是个特殊的标识符,有以下三种用法。 1、忽略返回值 这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写: v1, v2, _ := function(...) 2、用在变量
1、问题 构建fluentbit-operator工程manager模块docker镜像时报如下错误: ....... Step 5/15 : RUN go mod download &gt; Running in c54961171660 go: github.com/fsnotify/fsnot
1、自定义类型 在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct或者函数类型来定义。 //将KubeInt定义为int类型 ty
GO语言heap剖析 本节内容 heap使用 heap提供的方法 heap源码剖析 利用heap实现优先级队列 1. heap使用 在go语言的标准库container中,实现了三种数据类型:heap,list,ring,list在前面一篇文章中已经写了,现在要写的是heap(堆)的源码剖析。 首先