Как исправить ответ Windows 7 UDP создателю соединения Linux Linux?Где Linux на Linux работает, но Linux на Windows 7 не работает - PullRequest
1 голос
/ 05 января 2012

ПК Windows отправляет подтверждение.Но это не прибывает в Linux.Что мне не хватает?(Но когда я не использую Windows 7 и делаю тот же код под Linux для Linux, это работает.)

Любые идеи !!!

ПК с Windows 7: Отправитель / Ответчик

System.out.println("[UDP]: " 
          + "RemoteIP: " + IPAddress.toString() + " "
          + "Port: " + port + " " 
          + "Length: " + send.length() + " "
          + "Sending confirmation!"); // it shows it has correct ip, port and lenght                   
sockOutput = new DatagramPacket(send.getBytes(), send.length(), IPAddress, port);
serverSock.send(sockOutput);// is it failing???

ПК с Linux: приемник / коммандер

String receive = sendUDPBytes("request", ip).toString();

if (receive.length()<=0) // Waiting forever, and nothing happens LINUX.
{
    System.out.println("FAILED");
    System.exit(0);
} else {
      try {                                          
            /* JOB todo */
      } catch (Exception ex) {

      }                    
}
sockOutput.write(receive.getBytes());

public static String sendUDPBytes(String bytes, String[] ip) throws IOException
{            
    String downloaded = null;      
    DatagramSocket socket = new DatagramSocket();
    InetAddress IPAddress = InetAddress.getByName(ip[2]);

    byte[] sendData = new byte[14024];
    byte[] receiveData = new byte[14024];

    sendData = bytes.getBytes();
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length);
    socket.connect(IPAddress, 58889);
    if (socket.isConnected())
    {
        System.out.println("[UDP]: sending....., waiting......... until receive....");
        socket.send(sendPacket);
    }

    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    socket.receive(receivePacket);      
    downloaded = new String(receivePacket.getData());

    System.out.println("[UDP]: closing.....");
    socket.close();              
    return downloaded;
}

Последующие действия:

0) Не запутайтесь с "ВЫ В ОДНОЙ СУБСЕТЕ?"?? ", поэтому, если у вас есть сеть / 28, все могут обменять пакет.В этом случае это работает, но в большинстве случаев это не так.

1) Код идеален, когда я тестирую ЛВС в ЛВС, независимо от того, какая это операционная система, он работает (нет брандмауэра источника)

2) Когда я тестирую Windows на Windows на том же ПК, он тоже работает

3) Когда я тестирую Linux на Linux, он тоже работает

4) Когда я тестирую Linuxдля Windows или Windows для Linux это тоже работает

5) Тот же код, который я поместил на один центральный сервер, и тот же код, который я запускал на локальном ПК с Windows, и другие интернет-провайдеры, кажется, позволяют это.

6) Спрятал 10 часов, чтобы найти его

Угадай:

Что именно было тогда причиной?Ну, интернет-провайдер теряет пакет, который был отправлен на мой общедоступный IP-адрес, или, может быть, он отключает тех, у кого есть общедоступный IP-адрес.

1 Ответ

0 голосов
/ 05 января 2012

Вы делаете String bytes и getBytes() зависит от кодировки платформы. getBytes("UTF-8") будет явным.

Еще одна отличительная черта: Linux \ n, Windows \ r \ n.

toString() может вызвать исключение, если байты происходят из Windows Latin-1 (Cp1252), и он пытается интерпретировать их как UTF-8.


private void test(OutputStream sockOutput, String[] ip) throws IOException {
    String receive = sendUDPBytes("request", ip);

    if (receive.length() <= 0) // Waiting forever, and nothing happens LINUX.
    {
        System.out.println("FAILED");
        System.exit(0);
    } else {
        try {
            /*
             * JOB todo
             */
        } catch (Exception ex) {
        }
    }
    sockOutput.write(receive.getBytes("UTF-8"));
}

public static String sendUDPBytes(String bytes, String[] ip) throws IOException {
    return new String(sendUDPBytesRaw(bytes.getBytes("UTF-8"), ip), "UTF-8");
}

public static byte[] sendUDPBytesRaw(byte[] sendData, String[] ip) throws IOException {
    DatagramSocket socket = new DatagramSocket();
    InetAddress IPAddress = InetAddress.getByName(ip[2]);

    byte[] receiveData = new byte[14024];

    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length);
    socket.connect(IPAddress, 58889);
    if (socket.isConnected()) {
        System.out.println("[UDP]: sending....., waiting......... until receive....");
        socket.send(sendPacket);
    }

    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    socket.receive(receivePacket);
    byte[] downloaded = receivePacket.getData();

    System.out.println("[UDP]: closing.....");
    socket.close();
    return downloaded;
}
...