2 回答

TA貢獻1789條經(jīng)驗 獲得超8個贊
您可能希望net.Interfaces()獲得net.Interface()代表系統(tǒng)上網(wǎng)絡(luò)接口的片段,或者,如您所知的接口名稱,您可以使用它net.InterfaceByName()來獲取特定的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)于同時為多個接口執(zhí)行此操作,您可以為每個偵聽器/接口啟動一個 goroutine,并通過通道移動流量,但這實際上取決于您想要做什么。(您只是記錄數(shù)據(jù)、發(fā)送數(shù)據(jù)、修改數(shù)據(jù)等嗎?)

TA貢獻1982條經(jīng)驗 獲得超2個贊
撥號器的 LocalAddr 不適用于 ppp 接口,我們應(yīng)該SOL_SOCKET使用將標志設(shè)置為套接字setsockopt,對于 go 1.11+,您可以創(chuàng)建這樣的撥號器
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)注
- 183 瀏覽
添加回答
舉報