直播:后台 JWT 推流、前台画中画;WebRTC 服务与 Nginx WebSocket 代理
Made-with: Cursor
This commit is contained in:
119
server/vendor/github.com/wlynxg/anet/README.md
generated
vendored
Normal file
119
server/vendor/github.com/wlynxg/anet/README.md
generated
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
## Introduction
|
||||
In response to the modifications made to the permissions for accessing system MAC addresses in Android 11, ordinary applications encounter several main issues when using NETLINK sockets:
|
||||
|
||||
- Not allowing bind operations on `NETLINK` sockets.
|
||||
- Not permitting the use of the `RTM_GETLINK` functionality.
|
||||
|
||||
For detailed information, please refer to: https://developer.android.com/training/articles/user-data-ids#mac-11-plus
|
||||
|
||||
As a result of the aforementioned reasons, using `net.Interfaces()` and `net.InterfaceAddrs()` from the Go net package in the Android environment leads to the `route ip+net: netlinkrib: permission denied` error.
|
||||
|
||||
You can find specific issue details here: https://github.com/golang/go/issues/40569
|
||||
|
||||
To address the issue of using the Go net package in the Android environment, we have made partial modifications to its source code to ensure proper functionality on Android.
|
||||
|
||||
I have fully resolved the issues with `net.InterfaceAddrs()`.
|
||||
|
||||
However, for `net.Interfaces()`, we have only addressed some problems, as the following issues still remain:
|
||||
- It can only return interfaces with IP addresses.
|
||||
- It cannot return hardware MAC addresses.
|
||||
|
||||
Nevertheless, the fixed `net.Interfaces()` function now aligns with the Android API's `NetworkInterface.getNetworkInterfaces()` and can be used normally in most scenarios.
|
||||
|
||||
The specific fix logic includes:
|
||||
|
||||
Removing the `Bind()` operation on `Netlink` sockets in the `NetlinkRIB()` function.
|
||||
Using `ioctl` based on the Index number returned by `RTM_GETADDR` to retrieve the network card's name, MTU, and flags.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Test Code
|
||||
### net.Interface()
|
||||
use `net.Interface()`:
|
||||
```go
|
||||
func RawInterface() {
|
||||
interfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, i := range interfaces {
|
||||
log.Println(i)
|
||||
}
|
||||
}
|
||||
```
|
||||
result:
|
||||
```
|
||||
panic: route ip+net: netlinkrib: permission denied
|
||||
```
|
||||
|
||||
use `anet.Interface()`:
|
||||
```go
|
||||
func AnetInterface() {
|
||||
interfaces, err := anet.Interfaces()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, i := range interfaces {
|
||||
log.Println(i)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
result:
|
||||
```
|
||||
{1 65536 lo up|loopback|running}
|
||||
{15 1400 rmnet_data1 up|running}
|
||||
{24 1500 wlan0 up|broadcast|multicast|running}
|
||||
{3 1500 dummy0 up|broadcast|running}
|
||||
{4 1500 ifb0 up|broadcast|running}
|
||||
{5 1500 ifb1 up|broadcast|running}
|
||||
{12 1500 ifb2 up|broadcast|running}
|
||||
{14 1500 rmnet_data0 up|running}
|
||||
{16 1400 rmnet_data2 up|running}
|
||||
{17 1400 rmnet_data3 up|running}
|
||||
```
|
||||
|
||||
### net.InterfaceAddrs()
|
||||
use `net.InterfaceAddrs()`:
|
||||
```go
|
||||
func NetInterfaceAddrs() {
|
||||
addrs, err := net.InterfaceAddrs()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
log.Println(addr)
|
||||
}
|
||||
}
|
||||
```
|
||||
result:
|
||||
```
|
||||
panic: route ip+net: netlinkrib: permission denied
|
||||
```
|
||||
|
||||
use `anet.InterfaceAddrs()`:
|
||||
```go
|
||||
func AnetInterfaceAddrs() {
|
||||
addrs, err := anet.InterfaceAddrs()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
log.Println(addr)
|
||||
}
|
||||
}
|
||||
```
|
||||
result:
|
||||
```
|
||||
127.0.0.1/8
|
||||
::1/128
|
||||
...
|
||||
192.168.6.143/24
|
||||
fe80::7e4f:4446:eb3:1eb8/64
|
||||
```
|
||||
Reference in New Issue
Block a user