ServerSocket.getLocalSocketAddress() 返回空

ServerSocket.getLocalSocketAddress() returning empty

我正在尝试在 Android phone 和 Raspberry Pi 之间创建一个具有 Wi-Fi P2P 的本地服务器,Android 作为主机。我已经能够在 Pi 上使用 wpa_cli 成功建立 P2P 连接,但现在我正在尝试使用 C 客户端套接字连接到 phone 并传输数据。但是,Log.d("Socket waiting", serverSocket.getLocalSocketAddress().toString()); 行吐出 D/Socket waiting: ::/:::8888。它似乎根本没有地址,所以我应该如何连接到它?

正如我的评论所示,我的研究告诉我正确的 IP 应该是 192.168.49.1。如果 IP 有任何不同,那也没关系,因为我可以向 phone 发送一个 BLE 数据包,告诉它 IP。我的问题是IP完全空白。

我的代码如下,对于等待连接的线程:

public static class DataTransfer extends Thread {
        @Override
        public void run() {
            Log.d("DataTransfer", "Start");
            ServerSocket serverSocket = null;
            try {
                /**
                 * Create a server socket and wait for client connections. This
                 * call blocks until a connection is accepted from a client
                 */
                // Expects a connection at 192.168.49.1:8888
                serverSocket = new ServerSocket(8888);

                //serverSocket.setReuseAddress(true);
                //serverSocket.toString()
                Log.d("Socket waiting", serverSocket.getLocalSocketAddress().toString());

                Socket client = serverSocket.accept();
                InputStream inputstream = client.getInputStream();
                Log.d("InputStream Available", String.valueOf(inputstream.available()));

                serverSocket.close();
            }
            catch (IOException e) {
                Log.e("Receive Error", e.getMessage());
                if(serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (IOException ex) {
                        Log.e("Failed to close socket", ex.getMessage());
                    }
                }
                return;
            }
        }
    }

这里是 ip a 在 Pi 上的输出,一旦它通过 Wi-Fi P2P

连接
11: p2p-wlan0-8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b2:0e:07:e6:e6:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.23/24 brd 192.168.1.255 scope global noprefixroute p2p-wlan0-8
       valid_lft forever preferred_lft forever
    inet6 fe80::e79c:33f3:6e49:b6ed/64 scope link
       valid_lft forever preferred_lft forever

最终编辑: 我的问题似乎无关紧要。正如下面的两条评论所表明的,显示的 IP 没有问题,这只是意味着它接受来自任何事物的连接。我的实际问题是我在我的 Pi 上设置了一个静态 IP,但没有指定静态 IP 适用于哪个接口。客户端需要在 192.168.49.# 地址上,静态 IP 阻止了它。

::就是IPv6 default route。它表示您正在处理来自所有接口的请求。

这是预期的行为。这有什么问题吗?

您可以通过将地址传递给构造函数来指定服务器套接字正在侦听的接口:

serverSocket = new ServerSocket(8888, 10, InetAddress.getByName("192.168.49.1"));

看到 :: 表示您的服务器正在侦听 所有接口 上的 IPv6 连接。 IPv6 address of all zeros which can be written as ::. But you are trying to connect to an IPv4 address, not IPv6. Most systems I've worked with are configured so that IPv4 connections can be accepted by an IPv6 server, but I guess yours isn't. The answer to this question 表示您可以使用 sysctl:

更改系统的行为
sysctl net.ipv6.bindv6only=0