Java DatagramSocket не получает UDP-трансляцию от некоторых маршрутизаторов

1

У меня есть клиент Android и обычный Java-сервер как в одной подсети, так и я отправляю пакеты UDP-передачи от клиента к серверу. С некоторыми маршрутизаторами (Netgear, Cisco) сервер с радостью принимает пакеты, но для моего маршрутизатора Asus, когда серверный компьютер получает пакеты, сервер DatagramSocket не поддерживает.

NB Во всех случаях Wireshark показывает, что пакеты доходят до серверной машины. Но при использовании маршрутизатора Asus DatagramSocket, похоже, не видит их. Чтобы все было просто, сервер имеет только Ethernet-соединение с маршрутизатором.

Код довольно стандартный.

Клиент:

DatagramSocket socket = null;
try {
    socket = new DatagramSocket();
    socket.setSoTimeout(500); // 500 millis

    while (isRunning()) {
        final InetAddress broadcastAddress = getSubnetBroadcastAddress();
        final DatagramPacket outboundPacket = new DatagramPacket(REQUEST_MESSAGE, REQUEST_MESSAGE.length, broadcastAddress, broadcastPort);
        socket.send(outboundPacket);
    }

} catch (IOException e) {
    Log.i(TAG, "Beacon failed", e);
} finally {
    if (socket != null) {
        socket.close();
    }
}

private InetAddress getSubnetBroadcastAddress() throws IOException {
    final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    final DhcpInfo dhcp = wifi.getDhcpInfo();
    if (dhcp == null) {
        // No successful DHCP request. Go with best effort.
        Log.d(TAG, "#getBroadcastAddress - No DHCP info so using generic broadcast address");
        return InetAddress.getByName("255.255.255.255");
    }

    final int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    final byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++) {
        quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    }
    return InetAddress.getByAddress(quads);
}

Сервер:

    DatagramSocket socket = null;
    try {
        socket = new DatagramSocket(broadcastPort);
        socket.setSoTimeout(LISTENING_TIMEOUT);
        socket.setBroadcast(true);
        while (keepRunning) {
            try {
                final byte[] buffer = new byte[1024];
                final DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
                socket.receive(receivedPacket);
                log.debug("Received packet : " + receivedPacket.toString());
            } catch (SocketTimeoutException e) {
                log.debug("#run BeaconRunnable socket timed out");
            }
        }
    } catch (IOException e) {
        log.warn("Error while receiving message", e);
        if (socket != null) {
            socket.close();
        }
    }

Что заставляет DatagramSocket не видеть широковещательные пакеты UDP с маршрутизатором Asus?

Теги:
networking
sockets
udp
broadcast

1 ответ

2
Лучший ответ

Для тех, кто следует.

Нет ничего плохого в коде выше. В конфигурации маршрутизатора не было ничего плохого.

Правило добавлено в брандмауэр Windows, который блокировал входящий UDP от общедоступных соединений, а маршрутизатор Asus по какой-то причине считался общедоступным.

Отключение этого правила позволяет все работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню