type IPAddr struct {
IP IP
}
func ResolveIPAddr(net, addr string) (*IPAddr, error)
在呼叫 ResolveIPAddr() 函數時,引數 net 表示網路型別,可以是“ip”、“ip4”或“ip6”,引數 addr 是 IP 地址或域名,如果是 IPv6 地址則必須使用“[]”括起來。
func (a *IPAddr) Network() string
func (a *IPAddr) String() string
type IPConn struct {
//空結構
}
func (c *IPConn) ReadFromIP(b []byte) (int, *IPAddr, error)
func (c *IPConn) WriteToIP(b []bytez addr *IPAddr) (int, error)
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error)
在呼叫函數 ListenIP() 時,引數 netProto 是“網路型別+協定名”或“網路型別+協定號”,中間用“:”隔開,比如“IP4:IP”或“IP4:4”。引數 laddr 是伺服器本地地址,可以是任意活動的主機地址,或者是內部測試地址“127.0.0.1”。該函數呼叫成功,返回一個 IPConn 物件;呼叫失敗,返回一個錯誤型別。// IP Server 端設計 package main import( "fmt" "net" "os" ) func main() { name, err := os.Hostname() checkError(err) ipAddr, err := net.ResolveIPAddr("ip4", name) checkError(err) fmt.Println(ipAddr) conn, err := net.ListenIP("ip4:ip", ipAddr) checkError(err) for { handleClient(conn) } } func handleClient(conn *net.IPConn) { var buf [512]byte n, addr, err := conn.ReadFromIP(buf[0:]) if err != nil { return } fmt.Println("Receive from client", addr.String(), string(buf[0:n])) conn.WriteToIP([]byte("Welcome Client!"), addr) } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }
func DialIP (netProto string, laddr, raddr *IPAddr) (*IPConn, error)
在呼叫函數 DialIP() 時,引數 netProto 是“網路型別+協定名”或“網路型別+協定號”,中間用“:”隔開,比如“IP4:IP”或“IP4:4”。引數 laddr 是本地主機地址,可以設為 nil。引數 raddr 是對方主機地址,必須指定不能省略。函數呼叫成功後,返回 IPConn 物件;呼叫失敗,返回一個錯誤型別。func (c *IPConn) Close() error
該方法呼叫成功後,關閉 IPConn 連線;呼叫失敗,返回一個錯誤型別。// IP Client端設計 package main import( "fmt" "net" "os" ) func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) } service := os.Args[1] lAddr, err := net.ResolveIPAddr("ip4", service) checkError(err) name, err := os.Hostname() checkError(err) rAddr, err := net.ResolveIPAddr("ip4", name) checkError(err) conn, err := net.DialIP("ip4:ip", lAddr, rAddr) checkError(err) _, err = conn.WriteToIP([]byte("Hello Server!"), rAddr) checkError(err) var buf [512]byte n, addr, err := conn.ReadFromIP(buf[0:]) checkError(err) fmt.Println("Reply form server", addr.String(), string(buf[0:n])) conn.Close() os.Exit(0) } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }編譯並執行伺服器端和用戶端,測試過程如下:
啟動伺服器:go run .main.go
客戶機連線:go run .client.go 127.0.0.1
伺服器響應:Receive from client 127.0.0.1 Hello Server!
客戶機接收:Reply form server 192.168.1.104 Welcome Client!