我正在尝试在Android手机和Raspberry Pi之间以Wi-Fi P2P创建本地服务器,并以Android为主机。我已经能够使用Pi上的wpa_cli
成功建立P2P连接,但是现在我试图使用C客户端套接字连接到电话并传输数据。但是,行Log.d("Socket waiting", serverSocket.getLocalSocketAddress().toString());
吐出D/Socket waiting: ::/:::8888
。它似乎根本没有地址,那么我应该如何连接呢?
如我的评论所示,我的研究告诉我,正确的IP应该是192.168.49.1。如果IP有任何不同,那没关系,因为我可以向电话发送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;
}
}
}
这是通过Wi-Fi P2P连接后,Pi上的ip a
的输出
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阻止了它。
您可以通过将地址传递给构造函数来指定服务器套接字正在侦听的接口:
serverSocket = new ServerSocket(8888, 10, InetAddress.getByName("192.168.49.1"));
看到::
表示您的服务器正在监听所有接口上的IPv6连接。这由可以写为IPv6 address of all zeros的::
表示。但是您正在尝试连接到IPv4地址,而不是IPv6。我使用过的大多数系统都经过了配置,以便IPv6服务器可以接受IPv4连接,但是我想您的系统不能。 this question的答案表明您可以使用sysctl
来更改系统的行为:
sysctl net.ipv6.bindv6only=0
::
是IPv6 default route。它表明您正在处理来自所有接口的请求。
这是预期的行为。这有问题吗?