golang中net包用法(一)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

net包對於網路I/O提供了攜帶型介面,包括TCP/IP,UDP,網域名稱解析以及Unix Socket。儘管net包提供了大量訪問底層的介面,但是大多數情況下,用戶端僅僅只需要最基本的介面,例如Dial,LIsten,Accepte以及分配的conn串連和listener介面。 crypto/tls包使用相同的介面以及類似的Dial和Listen函數。下面對net包進行具體分析。

首先介紹其中常量:

const (    IPv4len = 4    IPv6len = 16)
很容易看出這表示ip地址的長度(bytes),其中ipv4長度是4,ipv6地址長度是16

變數:

常用的ipv4地址:

var (    IPv4bcast     = IPv4(255, 255, 255, 255) // 廣播位址    IPv4allsys    = IPv4(224, 0, 0, 1)       // 所有系統,包括主機和路由器,這是一個組播地址    IPv4allrouter = IPv4(224, 0, 0, 2)       // 所有組播路由器    IPv4zero      = IPv4(0, 0, 0, 0)         // 本網,只能作為本地源地址其才是合法的)

常用的IPV6地址:

var (    IPv6zero                   = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}         IPv6unspecified            = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}    IPv6loopback               = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}    IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}    IPv6linklocalallnodes      = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}    IPv6linklocalallrouters    = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02})


接下來講一下IPV4和IPV6相關知識,瞭解的請直接跳過。

IP地址(Internet Protocol Address,稱為互連網協議地址,簡寫為IP Address),是一種給主機在Internet上進行編址的方式。常見的IP地址,分為IPV4和IPV6地址兩類。

IPV4是由32位位元表示,其表示為XXX.XXX.XXX.XXX,每組XXX代表小於或等於255的10進位數,IPV4地址總數為232,不過,一些地址是為特殊用途所保留的,如專用網路(約18百萬個地址)和多播地址(約270百萬個地址)。其中IPV4分為ABCDE五類地址,分別進行介紹:

A類地址 第一位為0,注意是位1、第1位元組為網路地址,其它3個位元組為主機地址2、位址範圍:1.0.0.1—126.255.255.2543、10.X.X.X是私人地址,範圍從10.0.0.0-10.255.255.2554、127.X.X.X是保留地址,用做環回測試。B類地址 前兩位為10,注意是位1、 第1位元組和第2位元組為網路地址,後2個位元組為主機地址2、位址範圍:128.0.0.1—191.255.255.2543、私人位址範圍:172.16.0.0—172.31.255.2554、保留地址:169.254.X.X   
C類地址 前三位為110,注意是位1、前三個位元組為網路地址,最後位元組為主機地址2、位址範圍:192.0.0.1—223.255.255.2543、私人地址:192.168.X.X,範圍從192.168.0.0-192.168.255.255D類地址 前四位為1110,注意三位1、不分網路地址和主機地址。2、位址範圍:224.0.0.1—239.255.255.254E類地址 前五位為11110,注意四位1、不分網路地址和主機地址2、位址範圍:240.0.0.1—255.255.255.254此外還有幾個特殊IP地址:1、0.0.0.0隻能做源地址2、255.255.255.255是廣播位址3、127.x.x.x為迴路位址,本機使用4、專用地址:10/8 位址範圍:10.0.0.0——10.255.255.255,172.16/12 位址範圍:172.16.0.0——172.31.255.255,192.168/16位址範圍:192.168.0.0——192.168.255.255。 224.0.0.1     組播地址,注意它和廣播的區別。從224.0.0.0到239.255.255.255都是這樣的地址。224.0.0.1特指所有主機和路由器,224.0.0.2特指所有路由器。這樣的地址多用於一些特定的程式以及多媒體程式。如果你的主機開啟了IRDP(Internet路由發現,使用組播功能)功能,那麼你的主機路由表中應該有這樣一條路由。169.254.x.x     如果你的主機使用了DHCP功能自動獲得一個IP地址,那麼當你的DHCP伺服器發生故障,或回應時間太長而超出了一個系統規定的時間,Wingdows系統會為你分配這樣一個地址。如果你發現你的主機IP地址是一個諸如此類的地址,很不幸,十有八九是你的網路不能正常運行了。


至於單播廣播和組播介紹及優缺點,請看這篇文章:http://www.h3c.com.cn/products___technology/technology/group_management/other_technology/technology_recommend/200805/605846_30003_0.htm


由於IPV4地址共有232個地址,約為43億,導致其不夠使用,從而誕生了IPV6,IPV6地址長度為128位,其地址總數為2128個,IPV6解決了IPV4地址不夠用的問題,IPV6更加詳細介紹請參考http://zh.wikipedia.org/wiki/IPv6

func InterfaceAddrs() ([]Addr, error)  //InterfaceAddrs返回該系統的網路介面的地址清單。

func Interfaces() ([]Interface, error)   //Interfaces返回該系統的網路介面列表。
func JoinHostPort(host, port string) string   //JoinHostPort將host和port合并為一個網路地址。一般格式為"host:port";如果host含有冒號或百分比符號,格式為"[host]:port"。
func LookupAddr(addr string) (name []string, err error)  //對於給定的地址進行反向尋找,並返回映射到那個地址的一個list列表
func LookupCNAME(name string) (cname string, err error)  //返回給定名字的規範的DNS主機名稱,如果調用者不關心這個name是否規範,可以直接調用LookupHost 或者 LookupIP,這兩個函數都會在查詢時考慮到name的規範性。
func LookupHost(host string) (addrs []string, err error)     //通過利用本地解析器對給定的host進行尋找,返回主機地址的數組
func LookupIP(host string) (addrs []IP, err error)                //通過利用本地解析器尋找host,返回主機ipv4和ipv6地址的一個數組

舉例說明其用法:

package mainimport ("fmt""net")func main() {addr, _ := net.InterfaceAddrs()fmt.Println(addr) //[127.0.0.1/8 10.236.15.24/24 ::1/128 fe80::3617:ebff:febe:f123/64],本地地址,ipv4和ipv6地址,這些資訊可通過ifconfig命令看到interfaces, _ := net.Interfaces()fmt.Println(interfaces) //[{1 65536 lo  up|loopback} {2 1500 eth0 34:17:eb:be:f1:23 up|broadcast|multicast}] 類型:MTU(傳輸單元最大值),網路介面名,支援狀態hp := net.JoinHostPort("127.0.0.1", "8080")fmt.Println(hp) //127.0.0.1:8080,根據ip和連接埠組成一個addr字串表示lt, _ := net.LookupAddr("127.0.0.1")fmt.Println(lt) //[localhost],根據地址尋找到改地址的一個映射列表cname, _ := net.LookupCNAME("www.baidu.com")fmt.Println(cname) //www.a.shifen.com,尋找規範的dns主機名稱字host, _ := net.LookupHost("www.baidu.com")fmt.Println(host) //[111.13.100.92 111.13.100.91],尋找給定網域名稱的host名稱ip, _ := net.LookupIP("www.baidu.com")fmt.Println(ip) //[111.13.100.92 111.13.100.91],尋找給定網域名稱的ip地址,可通過nslookup www.baidu.com進行尋找操作.}


在講解下面函數用法之前,先說明幾個名詞含義(參考如下串連:http://blog.sina.com.cn/s/blog_7ff492150101kqbh.html):

網域名稱解析記錄A、CNAME、MX、NS、TXT、AAAA、SRV、顯性URL、隱形URL含義

1. A記錄(IP指向):把網域名稱(www.xxx.com)解析到某一個指定IP。使用者可以將該網域名稱解析到自己的web server上,同時也可以設定該網域名稱的次層網域。

2. CNAME記錄(Canonical Name 別名指向):相當於用子網域名稱代替IP地址。(優點:如果IP地址改變,只需要更改子網域名稱的解析即可。)

3. MX記錄:指向一個郵件伺服器,用於電子郵件系統發郵件時根據收信人的地址尾碼來定位郵件伺服器。

4. NS記錄:1. 解析伺服器記錄。用來表明由哪台伺服器對該網域名稱進行解析,這裡的NS記錄只對子網域名稱生效。例如使用者希望由15.54.66.88這台伺服器解析coco.mydomain.com,則需要設定coco.mydomain.com的NS記錄。

說明:

·“優先順序”中的數字越小表示層級越高;

·“IP地址/主機名稱”中既可以填寫IP地址,也可以填寫像ns.mydomain.com這樣的主機地址,但必須保證該主機地址有效。如,將coco.mydomain.com的NS記錄指向到ns.mydomain.com,在設定NS記錄的同時還需要設定ns.mydomain.com的指向,否則NS記錄將無法正常解析;

·優先順序:NS記錄優先於A記錄。即,如果一個主機地址同時存在NS記錄和A記錄,則A記錄不生效。這裡的NS記錄只對子網域名稱生效。

5. TXT記錄:為某個主機名稱或網域名稱設定聯絡資訊,如:

admin IN TXT "管理員, 電話: 13901234567"

mail IN TXT "郵件主機, 存放在xxx , 管理人:AAA"

Jim IN TXT "contact: abc@mailserver.com"

也就是您可以設定 TXT ,以便使別人聯絡到您。

6. AAAA記錄1. (AAAA record):是用來將網域名稱解析到IPv6地址的DNS記錄。使用者可以將一個網域名稱解析到IPv6地址上,也可以將子網域名稱解析到IPv6地址上。(設定AAAA記錄:

i. 主機記錄處填子網域名稱。若添加泛解析,則填寫*。若將主網域名稱直接進行解析,則留空或填寫@。

ii. 記錄類型為AAAA。記錄值為ip地址,只可以填寫IPv6地址(比如::1)。

iii. MX優先順序不需要填寫。

iv. TTL添加時系統會自動產生,預設為600秒。)

7. SRV記錄:一般是為Microsoft的活動目錄設定時的應用。DNS可以獨立於活動目錄,但是活動目錄必須有DNS的協助才能工作。為了活動目錄能夠正常的工作,DNS伺服器必須支援服務定位(SRV)資源記錄,資源記錄把服務名字映射為提供服務的伺服器名字。活動目錄客戶和網域控制站使用SRV資源記錄決定網域控制站的IP地址。

此技術細節請參考相應網站(看過的見論壇帖http://bbs.28tui.com/forum.php?mod=viewthread&tid=2321129)

8. 顯性URL記錄:訪問網域名稱時,會自動跳轉到所指的另一個網路地址(URL),此時在瀏覽器地址欄中顯示的是跳轉的地址。

9. 隱形URL記錄:訪問網域名稱時,會自動跳轉到所指的另一個網路地址(URL),此時在瀏覽器地址欄中顯示的是原網域名稱地址。

func LookupMX(name string) (mx []*MX, err error)  //尋找指定網域名稱的DNS MX郵件交換記錄,並按照優先順序進行返回。
func LookupNS(name string) (ns []*NS, err error)    //返回指定網域名稱的DNS NS記錄
func LookupPort(network, service string) (port int, err error)           //返回指定network和service的連接埠
func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err error)    //對指定的service服務,protocol協議以及name網域名稱進行srv查詢,其中proto協議表示tcp或者udp,返回的record記錄按照優先順序進行排序,同一優先順序下的按照weight權重進行隨機排序。LookupSRV函數按照RFC 2782標準來構建用於查詢的DNS。也就是說,它查詢_service._proto.name。當service和proto參數都是Null 字元串時,LookupSRV將會直接尋找name。
func LookupTXT(name string) (txt []string, err error)  //尋找指定網域名稱的DNS TXT記錄
func SplitHostPort(hostport string) (host, port string, err error)  //SplitHostPort將如下形式的網路地址拆分成host和port形式,其中拆分前的格式如下:"host:port","[host]:port" or "[ipv6-host%zone]:port",其中ipv6的地址或者主機名稱必須用方括弧括起來,如"[::1]:80"、"[ipv6-host]:http"、"[ipv6-host%zone]:80"


接下來講述一下net包中存在的error:

type Error  //表示網路錯誤

type Error interface {error      //錯誤Timeout() bool   // Is the error a timeout? 該錯誤是時間逾時錯誤嗎?Temporary() bool // Is the error temporary? 這個錯誤是一個臨時錯誤嗎?}
任何實現了error介面中方法的結構體都實現了網路error

其主要有以下集中錯誤:

type AddrError //網路地址錯誤

type AddrError struct {Err  string  //錯誤Addr string //地址字串表示}

func (e *AddrError) Error() string          //錯誤
func (e *AddrError) Temporary() bool   //該錯誤是否是一個臨時錯誤

func (e *AddrError) Timeout() bool       //該錯誤是否是逾時錯誤


type DNSConfigError //DNS配置錯誤,表示在讀取機器DNS配置過程中出現的錯誤

type DNSConfigError struct {Err error}
func (e *DNSConfigError) Error() string
func (e *DNSConfigError) Temporary() bool
func (e *DNSConfigError) Timeout() bool


type DNSError   //DNS錯誤,表示DNS查詢錯誤

type DNSError struct {Err       string // description of the error,錯誤描述Name      string // name looked for,查詢 名稱Server    string // server used,服務IsTimeout bool,是否逾時}
func (e *DNSError) Error() string
func (e *DNSError) Temporary() bool
func (e *DNSError) Timeout() bool

以DNSError為例,舉例說明net保重Error的用法

package mainimport ("fmt""net")func main() {dnserror := net.DNSError{Err:       "dns error",Name:      "dnserr",Server:    "dns search",IsTimeout: true,}fmt.Println(dnserror.Error())     //lookup dnserr on dns search: dns errorfmt.Println(dnserror.Temporary()) //truefmt.Println(dnserror.Timeout())   //truefmt.Println(dnserror.Server)      //dns searchfmt.Println(dnserror.Err)         //dns errorfmt.Println(dnserror.Name)        //dnserrfmt.Println(dnserror.IsTimeout)   //true}

type InvalidAddrError  //無效地址錯誤

type InvalidAddrError string

func (e InvalidAddrError) Error() string
func (e InvalidAddrError) Temporary() bool
func (e InvalidAddrError) Timeout() bool



type OpError        //操作錯誤,OpError是在net包中經常背用刀的一個函數,它描述一個錯誤的操作,網路類型以及地址。

type OpError struct {Op string   //Op是引起錯誤的操作,如"read"或"write"Net string      //Net表示錯誤出現的網路類型,如tcp或者udp6Addr Addr    //Addr表示錯誤出現的網路抵制Err error    //Err表示錯誤}

func (e *OpError) Error() string
func (e *OpError) Temporary() bool
func (e *OpError) Timeout() bool

在OpError錯誤中大部分錯誤會包含如下錯誤:

var (    ErrWriteToConnected = errors.New("use of WriteTo with pre-connected connection"))


type ParseError   //解析錯誤,ParseError表示一個格式錯誤的字串,其中Type表示期望的格式。

type ParseError struct {Type stringText string}
func (e *ParseError) Error() string    //將錯誤表示為字串形式

type UnknownNetworkError  //未知網路錯誤

type UnknownNetworkError string

func (e UnknownNetworkError) Error() string
func (e UnknownNetworkError) Temporary() bool
func (e UnknownNetworkError) Timeout() bool



type Addr   //網路終端地址

type Addr interface {Network() string // 網路名稱String() string  // 地址字串表示}

type Conn    //conn是一個通用的面向流的網路連接,多個goroutine可以同時調用conn中的方法。

type Conn interface {// Read從串連中讀取資料,Read方法會在超過某個固定時間限制後返回一個表示逾時的錯誤,該錯誤的TImeout()==TrueRead(b []byte) (n int, err error)// Write向conn中寫入資料,與Read類似, Write方法也會在超過某個固定時間後返回逾時錯誤,該錯誤的Timeout()==TrueWrite(b []byte) (n int, err error)// Close方法關閉該串連,同時任何阻塞的Read或Write方法將不再阻塞,並且返回錯誤。Close() error// 返回本網地址LocalAddr() Addr// 返回遠端網路地址RemoteAddr() Addr// 設定串連的讀寫deadline,它等價於調用SetReadDeadline和SetWriteDeadline進行conn串連的讀寫deadline設定。其中deadline是一個絕對時間,        //在deadline時間之後,任何的讀寫操作都不再阻塞,而是直接失敗,deadline對之後的所有I/O操作都起效,而不僅僅是下一次的讀或寫操作,// :一:空閑逾時,這種方法實現其中有兩類逾時比較特殊是在每次成功讀或者寫操作後都延長逾時期限,當沒有讀寫操作空閑時便會逾時;二:參數t為零值表示不設定        //逾時期限,即不會逾時timeoutSetDeadline(t time.Time) error// 設定串連的讀操作deadline,參數t為零值表示不設定期限SetReadDeadline(t time.Time) error// 設定串連的寫操作deadline,參數t為零值表示不設定期限// 即使寫逾時,也有可能出現寫入字數n>0,說明成功寫入了部分資料,但是沒有將資料全部寫入。SetWriteDeadline(t time.Time) error}

func Dial(network, address string) (Conn, error)    //Dial 串連到指定address和name的網路,其中network包含如下幾種:"tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),"udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4"(IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and"unixpacket". 對於TCP和UDP網路來說,addresses的形式如下host:port,其行使和JoinHostPort以及SplitHostPort函數中的addresses形式一致。舉例如下所示:

Dial("tcp", "12.34.56.78:80")Dial("tcp", "google.com:http")Dial("tcp", "[2001:db8::1]:http")Dial("tcp", "[fe80::1%lo0]:80")
對於IP網路,network必須是ip,ipv4或者ipv6,並且他們後面必須跟著冒號和協議數字協議名字,並且這個地址必須是一個ip地址,舉例如下:

Dial("ip4:1", "127.0.0.1")Dial("ip6:ospf", "::1")
對於Unix網路來說,address必須是一個檔案系統的路徑。

func DialTimeout(network, address string, timeout time.Duration) (Conn, error) //該函數與Dial函數類似,但是多一個逾時設定timeout,如果需要的話,timeout中包含網域名稱解析
func FileConn(f *os.File) (c Conn, err error)     //FileConn返回一個對檔案f的網路連接的複製copy,當調用完畢後,使用者需要自己關閉檔案f,由於是複製關係,所以關閉c和關閉f二者互不影響。
func Pipe() (Conn, Conn)      //Pipe在記憶體中建立一個同步全雙工系統的網路連接。串連的兩端都實現了Conn介面。一端的讀取對應另一端的寫入,在這個過程中複製資料是直接在兩端之間進行複製,而沒有內部緩衝。

type Dialer  //包含串連到一個地址的選項,//在Dialer結構體中的每個參數的零值相當於沒有那個值,因此調用零值的Dialer中的Dial函數相當於直接調用Dial函數

type Dialer struct {// Timeout是dial操作等待串連建立的最大時間長度,預設值代表沒有逾時。如果Deadline欄位也被設定了,dial操作也可能更早失敗。// 不管有沒有設定逾時,作業系統都可能強制執行它的逾時設定。例如,TCP(系統)逾時一般在3分鐘左右。Timeout是一個相對時間,是時間段,而Deadline是一個絕        //對時間,是時間點,這是二者的區別Timeout time.Duration       // Deadline是一個具體的時間點期限,超過該期限後,dial操作就會失敗。如果Timeout欄位也被設定了,dial操作也可能更早失敗。零值表示沒有期限。Deadline time.Time       // LocalAddr是dial一個地址時使用的本地地址。// 該地址必須是與dial的網路相容的類型。// 如果為nil,將會自動選擇一個本地地址。LocalAddr Addr        // 當網路類型是tcp並且一個主機名稱字具有多個dns記錄地址時,DualStack允許一個dial建立多個ipv4和ipv6的串連,並且返回第一個建立的串連DualStack bool        // KeepAlive指定一個網路連接的保持聲明的時間段;如果為0,會禁止keep-alive。當網路通訊協定不支援keep-alives時便會忽略掉這個值。// 不支援keep-alive的網路連接會忽略本欄位。KeepAlive time.Duration}
func (d *Dialer) Dial(network, address string) (Conn, error)   //Dial在指定的網路上串連指定的地址。詳細用法參見Dial函數擷取網路和地址參數的描述


type Flags

type Flags uint

const (FlagUp           Flags = 1 << iota // 介面處於互動狀態FlagBroadcast                      // 介面支援廣播FlagLoopback                       // 介面是迴環介面FlagPointToPoint                   // 介面屬於點到點FlagMulticast                      // 介面支援組播)
func (f Flags) String() string   //將f用字串表示


type HardwareAddr  //硬體地址,HardwareAddr表示一個物理硬體地址

type HardwareAddr []byte
func ParseMAC(s string) (hw HardwareAddr, err error) //將字串解析成硬體物理地址,其中ParseMAC函數使用如下格式解析一個IEEE 802 MAC-48、EUI-48或EUI-64硬體地址:

01:23:45:67:89:ab01:23:45:67:89:ab:cd:ef01-23-45-67-89-ab01-23-45-67-89-ab-cd-ef0123.4567.89ab0123.4567.89ab.cdef

func (a HardwareAddr) String() string  //硬體地址的字串表示


type Interface   //Interface表示一個在網路介面名和索引之間的映射,他也包含網路借口裝置資訊。

type Interface struct {Index        int          // 索引,必須為正整數MTU          int          // 傳輸單元最大值Name         string       // 名字,例如: "en0", "lo0", "eth0.100"HardwareAddr HardwareAddr //硬體地址,例如: IEEE MAC-48, EUI-48 and EUI-64 formFlags        Flags        // flags標記,例如: FlagUp, FlagLoopback, FlagMulticast}

func InterfaceByIndex(index int) (*Interface, error)    //通過指定的索引index返回相應的介面
func InterfaceByName(name string) (*Interface, error) //通過指定的名字Name返回相應的介面
func (ifi *Interface) Addrs() ([]Addr, error)          //返回指定介面的address
func (ifi *Interface) MulticastAddrs() ([]Addr, error)   //MulticastAddrs返回網路介面ifi加入的多播組地址。

type Listener  //Listener是一個用於面向流的網路通訊協定的公用的網路監聽器介面。多個線程可能會同時調用一個Listener的方法。

type Listener interface {Accept() (c Conn, err error)//等待並返回下一個串連到該串連的串連Close() error   //關閉listener,關閉後,任何阻塞accept的操作都不再阻塞,並且返回errorAddr() Addr   //返回該介面的網路地址}

func FileListener(f *os.File) (l Listener, err error)   //返回對於檔案f的網路listener的複製。
func Listen(net, laddr string) (Listener, error)  //返回在一個本網地址laddr上監聽的Listener。網路型別參數net必須是面向流的網路:"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。具體參見Dial函數擷取laddr的文法。

type PacketConn
func FilePacketConn(f *os.File) (c PacketConn, err error)
func ListenPacket(net, laddr string) (PacketConn, error)

type MX  //MX代表一條DNS MX記錄(郵件交換記錄),根據收信人的地址尾碼來定位郵件伺服器。

type MX struct {Host stringPref uint16}


type NS  //NS代表一條DNS NS記錄(網域名稱伺服器記錄),指定該網域名稱由哪個DNS伺服器來進行解析。

type NS struct {Host string}

type SRV  //SRV代表一條DNS SRV記錄(資源記錄),記錄某個服務由哪台電腦提供。

type SRV struct {Target   stringPort     uint16Priority uint16Weight   uint16}

參考:

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

  


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.