ServerSocket.getLocalSocketAddress() returning empty

筅森魡賤 提交于 2020-06-16 17:27:07

问题


I'm trying to create a local server with Wi-Fi P2P between an Android phone and a Raspberry Pi, with the Android as the host. I have been able to successfully establish a P2P connection using wpa_cli on the Pi, but now I am trying to use a C client socket to connect to the phone and transfer data. However, the line Log.d("Socket waiting", serverSocket.getLocalSocketAddress().toString()); spits out D/Socket waiting: ::/:::8888. It doesn't seem to have an address at all, so how am I supposed to connect to it?

As indicated by my comment, my research told me that the correct IP should be 192.168.49.1. If the IP were any different, that would be okay, because I can just send a BLE packet to the phone, telling it the IP. My issue is that the IP is entirely blank.

My code is as follows, for a thread that waits on a connection:

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;
            }
        }
    }

And here is the output of ip a on the Pi, once it is connected via 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

Final edit: My problem was seemingly unrelated. As both comments below indicate, the IP shown off is fine, it just means it accepts connections from anything. My actual issue was that I had a static IP set up on my Pi without specifying which interface the static IP was for. The client needed to be on a 192.168.49.# address, and the static IP was preventing it.


回答1:


You can specify the interface the server socket is listening on by passing an address to the constructor:

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

Seeing :: means your server was listening for IPv6 connections on all interfaces. That is represented by the 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 suggests you may be able to change your system's behavior with sysctl:

sysctl net.ipv6.bindv6only=0



回答2:


:: is the IPv6 default route. It indicates that you are serving requests from all interfaces.

This is the expected behavior. Is there a problem with that?



来源:https://stackoverflow.com/questions/62237810/serversocket-getlocalsocketaddress-returning-empty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!