2018年7月10日 星期二

net package of Golang

net package是幫network I/O 提供一個可攜性的介面

包括 TCP/IP, UDP, domain name solution, Unix domain socket.

net package 支援的網路類型 network

基本四類 ip, tcp, udp, unix ,請見文件Dial 一節

"tcp",
"tcp4" (IPv4-only),
"tcp6" (IPv6-only)
"udp",
"udp4" (IPv4-only),
"udp6" (IPv6-only),
"ip", "ip4" (IPv4-only)
"ip6" (IPv6-only)
"unix"
"unixgram"
"unixpacket".

network又可分為兩類
無連接 ip, udp, unix(DGRAM),
建立連接 tcp, unix(STREAM),需要監聽,有listener。

無連接基礎interface是Conn
有連接基礎interface是PacketConn

network interface 三個主要組成

1. sever 負責listen,取得conn
2. client 負責連上server (dial),建立conn
3. conn  stream導向的連線(Conn is a generic stream-oriented network connection.)

整個核心就是對conn的操作

基本模型
1. listen(server side)取得listener, accept之後取得conn
2. dial(client side)取得conn
3. conn的操作

Dial / Listen func
func Dial(network, address string) (Conn, error)
func Listen(net, laddr string) (Listener, error)


Example:
Dial("tcp", "golang.org:http")
Dial("tcp", "192.0.2.1:http")
Dial("tcp", "198.51.100.1:80")
Dial("udp", "[2001:db8::1]:domain")
Dial("udp", "[fe80::1%lo0]:53")
Dial("tcp", ":80")


//client
conn, err := net.Dial("tcp", "golang.org:80")

if err != nil {
 // handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')


//server
ln, err := net.Listen("tcp", ":8080")
if err != nil {
 // handle error
}
for {
 conn, err := ln.Accept()
 if err != nil {
  // handle error
 }
 go handleConnection(conn)
}

Conn是各種conn的基礎interface,
Dial()會判斷網路類型,回傳對應的conn。
例如是TCP網路,回傳TCPConn。

可以用dial()取得conn或是用各自的dial取得各自的conn。

取得Conn
func Dial(network, address string)(Conn,error)
func DialTimeout(network, address string, timeout time.Duration)(Conn,error)
func FileConn(f *os.File)(c Conn, err error)
func Pipe()(Conn,Conn)

取得Listener
func FileListener(f *os.File)(ln Listener, err error)
func Listen(network, address string)(Listener, error)


type Conn interface {
  
     Read(b []byte) (n int, err error)

     Write(b []byte) (n int, err error)
  
     Close() error
  
     LocalAddr() Addr
 
     RemoteAddr() Addr
 
     SetDeadline(t time.Time) error
 
     SetReadDeadline(t time.Time) error
 
     SetWriteDeadline(t time.Time) error
 }

type PacketConn interface {
  
     ReadFrom(b []byte) (n int, addr Addr, err error)

     Close() error

     LocalAddr() Addr

     SetDeadline(t time.Time) error

     SetReadDeadline(t time.Time) error

     SetWriteDeadline(t time.Time) error
}

各種CONN


Conn
  a interface, generic stream-oriented network connection.
  Read()
  Write()
PacketConn
  a interface, generic packet-oriented network connection.
網路層的conn
  ReadFrom()
  WriteTo()

Conn跟PacketConn是兩種基礎interface,實際應用的四種Conn分別實作他們。

IPConn
  實作Conn及PacketConn的IP network connections.
  func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)
  func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error)

TCPConn
  實作Conn的TCP network connections.
  func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)
  func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)

UDPConn
  實作Conn及PacketConn的UDP network connections.
  func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error)
  func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error)

UnixConn
  實作Conn及PacketConn的Unix socket connections.
  SOCK_DGRAM
  func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)
  func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error)

  SOCK_STREAM
  func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)
  func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error)

通用func


func ListenPacket(net, laddr string) (PacketConn, error)
監聽ip, udp, unix(DGRAM)等協議,返回packetConn。
packetConn可能是IPConn, UDPConn, UnixConn。

func Listen(net, laddr string) (Listener, error)
監聽tcp, unix(stream)等協議。返回Listener。
Listener有可能是TCPListener, UnixListener。

func Dial(network, address string) (Conn, error)
返回Conn。
依據network有可能是IPConn, UDPConn, TCPConn, UnixConn。

各network(IP/TCP/UDP/Unix)相關的物件


Conn
Addr
Listener

Example:
  IPConn
  IPAddr
  TCPAddr
  TCPConn
  TCPListener
  UDPAddr
  UDPConn
  UnixAddr
  UnixConn
  UnixListener

其他相關物件


Addr
Buffers
IP
IPNet
IPMask
MX
NS
Resolver  支援功能

支援功能


func LookupAddr(addr string) (names []string, err error)
func LookupCNAME(host string) (cname string, err error)
func LookupHost(host string) (addrs []string, err error)
func LookupIP(host string) ([]IP, error)
func LookupMX(name string) ([]*MX, error)
func LookupNS(name string) ([]*NS, error)
func LookupPort(network, service string) (port int, err error)
func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err error)
func LookupTXT(name string) ([]string, error)

沒有留言:

張貼留言