作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的服务器创建了一个多播套接字来监听 UDP 数据包。它正在接收发送到网络广播地址的数据包,但我无法获取发件人的 IP 地址:
multisocket.getInetAddress().getHostAddress();
返回
"::"
(我猜是因为 null getInetAddress)。
如何获取发件人的IP地址?
提示:我猜这与未绑定(bind)套接字和基本上整个广播有关,因为这些数据包不是专门发送给我而是发送到整个网络,但它们不应该包含发件人的 IP 地址吗?请赐教。
代码如下:
public void run() {
try {
Thread.sleep(5000);
Log.i("SERVERUDP", "Connecting...");
MulticastSocket multisocket = new MulticastSocket(SERVERPORT);
multisocket.setBroadcast(true);
Log.i("SERVERUDP","Server's IP is: " + multisocket.getLocalAddress().getHostAddress());
getLocalIpAddress();
while(true){
byte[] b = new byte[65535];
ByteArrayInputStream b_in = new ByteArrayInputStream(b);
DatagramPacket dgram = new DatagramPacket(b, b.length);
multisocket.receive(dgram); // blocks
ObjectInputStream o_in = new ObjectInputStream(b_in);
Object o = o_in.readObject();
dgram.setLength(b.length);
b_in.reset();
if(o.getClass().getSimpleName().equalsIgnoreCase("Request")){
Request request = (Request)o;
String inetaddress = multisocket.getInetAddress().getHostAddress();
Log.i("SERVERUDP-if", "Sending request to IP: " + inetaddress);
new Thread(new ClientTCP(inetaddress, createRequestFromBroadcast(request))).start();
}else if(o.getClass().getSimpleName().equalsIgnoreCase("String")){
Log.e("SERVERUDP-elseif-string", "WTF received a string: " + (String)o);
}else{
Log.e("SERVERUDP-else", "Unrecognized object of type: " + o.getClass().getSimpleName());
}
o_in.close();
//iteration done only once for testing!
break;
}
multisocket.close();
} catch (Exception e) {
Log.e("SERVERUDP", "Error", e);
}
}
最佳答案
您收到的每个数据包可能有不同的源地址。所以我不确定您为什么要尝试查看 multisocket
来找出源地址。
我必须承认我还没有尝试过这个,但是 dgram.getSocketAddress ()
在 multisocket.receive
调用返回后是否给你你想要的东西?
关于java - 如何从正在监听广播的多播套接字获取 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365655/
我是一名优秀的程序员,十分优秀!