2012-01-05 44 views
1

PC Windows正在發送確認信息。但是這並沒有到達Linux。 我錯過了什麼? (但是,當我不使用Windows 7並在Linux下執行相同的代碼到Linux它的工作。)如何修復Linux UDP連接創建者的Windows 7 UDP回覆? Linux到Linux的工作方式,但Linux到Windows 7不能正常工作

任何想法!

Windows 7的PC:發件人/ Replyer

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的PC:接收器/指揮官

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)別和混淆「是U IN A SAME SUBSET ???「,所以如果你有/ 28網絡都可以交換數據包。在那種情況下,它可以工作,但大部分時間情況並非如此。

1)的代碼是完美的,當我測試LAN到LAN不管它是什麼操作系統,它的工作原理(沒有防火牆ofcource)

2)當我在它的工作原理相同的PC測試Windows到Windows太

3)當我測試的Linux到Linux它也能工作

4)當我測試的Linux到Windows或Windows到Linux的它也能工作

5)同樣的代碼,我把在一箇中央服務器和我在本地Windows PC和其他ISP服務器上運行的代碼相同ems允許它。

6)SP-結束10小時找到它

猜測:

到底是什麼那麼原因是什麼?那麼,ISP正在丟失發送給我的公共IP的數據包,或者即使我擁有公共IP,也可能會禁用這些數據包。

+1

的Windows到Windows的工作? – m0skit0 2012-01-05 11:08:50

+0

您的Windows防火牆是否已關閉?你可以在同一個窗口框上運行發送者/接收者嗎? – 2012-01-05 11:09:19

+0

請記住,UDP是不可靠的。 – 2012-01-05 11:20:21

回答

0

你在做String bytesgetBytes()取決於平臺編碼。 getBytes("UTF-8")將是明確的。

另一件事是不同的換行符:Linux \ n,Windows \ r \ n。

如果字節來自Windows Latin-1(Cp1252),toString()可能會引發異常,並嘗試將它們解釋爲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; 
} 
+0

@Google我開始相信自己是對的,特別是使用您發送的純ASCII,但我仍然使用'byte []'編輯我的答案,所以如果沒有人回答,您可以嘗試一下。 – 2012-01-05 11:51:25

+0

要刪除,請避免混淆。請參閱我的編輯。它的工作方式正是我的代碼,也是你的樣本。這只是我的ISP阻止我的公共IP UDP隨機端口開放,這實際上是達格拉姆。 – YumYumYum 2012-01-05 19:54:33

+0

感謝您的信息;我看不到任何錯誤,端口> 1000,沒有防火牆。 – 2012-01-05 20:03:00

相關問題