2 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可能希望net.Interfaces()獲得net.Interface()代表系統(tǒng)上網(wǎng)絡(luò)接口的片段,或者,如您所知的接口名稱,您可以使用它net.InterfaceByName()來(lái)獲取特定的net.Interface.
ppp0, err := net.InterfaceByName("ppp0")
然后您可以調(diào)用Interface.Addrs()返回的net.Interface并獲取接口的 IP 地址。
addrs, err := ppp0.Addrs()
然后,您可以在其余代碼中使用所需的地址(可能使用net.ListenIP或net.DialIP.
addr, err := net.ResolveIPAddr("ip4", addrs[0])
// check err
conn, err := net.ListenIP("ip4:pptp", addr)
// check err, then do stuff with conn
關(guān)于同時(shí)為多個(gè)接口執(zhí)行此操作,您可以為每個(gè)偵聽(tīng)器/接口啟動(dòng)一個(gè) goroutine,并通過(guò)通道移動(dòng)流量,但這實(shí)際上取決于您想要做什么。(您只是記錄數(shù)據(jù)、發(fā)送數(shù)據(jù)、修改數(shù)據(jù)等嗎?)

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
撥號(hào)器的 LocalAddr 不適用于 ppp 接口,我們應(yīng)該SOL_SOCKET使用將標(biāo)志設(shè)置為套接字setsockopt,對(duì)于 go 1.11+,您可以創(chuàng)建這樣的撥號(hào)器
dialer := net.Dialer{
Control: func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
err := syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, 25, "ppp0")
if err != nil {
log.Printf("control: %s", err)
return
}
})
},
}
// use the dialer
- 2 回答
- 0 關(guān)注
- 192 瀏覽
添加回答
舉報(bào)