Golang は IP スイッチングを実装します
ネットワーク プログラミングでは、IP アドレスが重要な役割を果たします。ただし、一部の特殊なアプリケーション シナリオでは、IP スイッチングを実装する必要があります。たとえば、一部のクローラー プログラム、オンライン ゲームなどでは、操作を確実に成功させるために IP を頻繁に切り替える必要があります。 IP スイッチングを実装する場合、golang はより簡単な方法を提供できます。
ネットワーク プログラミングでは、IP アドレスは通常 32 バイナリ ビットで構成され、通常は「.」で区切られた 4 つの 10 進数として記述されます。 192.168.100.1 など。このうち、IP アドレスの最初の 3 つのセグメントはネットワーク番号を表し、最後のセグメントはホスト番号を表します。
IP 切り替えは、golang の net パッケージ配下の関数を呼び出すことで実現できます。まず、このマシンの IP アドレスを取得する必要があります。次のコードを使用できます:
addrs, err := net.InterfaceAddrs() if err != nil { log.Fatal(err) } for _, addr := range addrs { if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil { fmt.Printf("local ip address: %s\n", ipnet.IP.String()) } }
上記のコードは、このマシンのすべてのネットワーク インターフェイスを横断して IP アドレスを取得します。このうち、ok は現在の IP アドレスが net.IPNet タイプのアドレスに属し、ループバック アドレスではないことを意味し、ipnet.IP.To4() != nil は返された IPv4 タイプのアドレスであることを意味します。
IP アドレスのリストがあり、次のコードを使用してそのうちの 1 つを選択できるとします。
var ips = []string{"192.168.0.101", "192.168.0.102", "192.168.0.103"} conn, err := net.Dial("udp", "baidu.com:80") if err != nil { log.Fatal(err) } localAddr := conn.LocalAddr().(*net.UDPAddr) defer conn.Close() var ip net.IP for _, v := range ips { parsedIP := net.ParseIP(v) if parsedIP == nil { //无法将字符串转换为IPv4或IPv6地址 continue } if localAddr.IP.Equal(parsedIP) { continue } ip = parsedIP break }
上記のコードでは、最初に net.Dial 関数を使用して電話をかけます。 UDP 接続。次に、IP リストで簡単に選択できるように、接続のローカル IP アドレスを取得します。 IP リストを調べて、使用可能な IP アドレスを探し、最後にローカル IP とは異なる IP アドレスを選択して、IP アドレスの切り替えを完了します。
ターゲット Web サイトをクロールする場合、多くの場合、プロキシを介した IP スイッチングを実装する必要があります。次に、IPスイッチングにプロキシを使用する方法を説明します。
最初に、プロキシ タイプを定義する必要があります。
type Proxy struct { URL string User string Password string DialerFunc func(network, address string) (net.Conn, error) }
プロキシ タイプには、プロキシ アドレス (URL)、プロキシ認証 (ユーザー、パスワード)、およびダイヤル機能が含まれます。このうち、ダイヤル関数のパラメータはネットワーク プロトコル (TCP、UDP など) と指定された IP アドレスであり、ネットワーク接続インスタンスを返します。
これに基づいて、次のコードを使用して IP スイッチングを実行できます:
func main() { var proxy = Proxy{ URL: "http://60.205.200.130:80", User: "", Password: "", DialerFunc: func(network, address string) (conn net.Conn, e error) { return net.Dial("tcp", "60.205.200.130:80") }, } transport := &http.Transport{ Dial: proxy.DialerFunc, } client := &http.Client{ Transport: transport, } res, err := client.Get("http://www.baidu.com") if err != nil { log.Fatal(err) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) }
コードでは、最初にプロキシ タイプを定義し、その中で DialerFunc 関数を定義します。 net.Dial 関数を使用してネットワーク アドレス 60.205.200.130:80 に接続し、TCP 接続を確立しました。次に、&http.Transport タイプのインスタンスを定義し、http リクエストに応答するために使用される Dial 関数を渡します。最後に、&http.Client タイプのインスタンスを定義し、http リクエストの実行に使用される Transport インスタンスを渡します。
上記のコードに基づいて、プロキシ アドレスを複数回切り替えることで、IP スイッチングの目的を達成できます。
まとめ
この記事では主にgolangでIPスイッチングを実装する方法を紹介しますが、golangではnetパッケージの機能を利用することでより簡単にIPアドレスを操作することができます。プロキシを使用すると、アプリケーション シナリオのニーズを満たすために、Web クローラーなどのアプリケーションでさまざまな IP アドレスに対するシミュレートされたリクエストを実装できます。
以上がgolangでIPスイッチングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。