-1

ここに UDP ping クライアントがあります。127.0.0.1うまくできたかどうかはわかりませんが、IPアドレスとして設定すればうまくいくと思います。しかし、たとえば Google の IP アドレスに設定すると、そうはなりません。例外が発生します: java.net.SocketTimeoutException: Receive timed out .

import java.io.*;
import java.net.*;
import java.util.*;

public class PingClient {

    private static final int AVERAGE_DELAY = 0;
    public static void main(String[] args) throws Exception    {
        int port = 4997;
        DatagramSocket socket = new DatagramSocket(port);

        for(int i=1;i<=10;i++) {
            byte[] buf = new byte[1024] ;
            Calendar cal=Calendar.getInstance();
            String ping="PING "+ i +" "+cal.getTimeInMillis()+" ms"+"\r\n";
            buf=ping.getBytes("UTF-8");
            InetAddress address = InetAddress.getByName("69.63.176.11");
            DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
            packet.setData(buf);
            socket.send(packet);
            Thread.sleep( 10* AVERAGE_DELAY);
            DatagramPacket server_response = new DatagramPacket(new byte[1024], 1024);
            socket.setSoTimeout(1000);
            socket.receive(server_response);
            printData(server_response);
        }   
    }
}


4

1 に答える 1

1

Ping は、インターネット時代の興味深い恐竜です。

残念ながら、使用しているプラ​​ットフォームを指定していません。Windows プラットフォームでは、127.0.0.1 (localhost アドレス) は実際のネットワーク アダプターを介してルーティングされません。Microsoft は、スタックの別の部分を通過するように localhost ルーティングを最適化したので、ネットワーク接続に関係なく常に動作します。

Unix ベースのホストでは、ネットワーク スニファーを使用して「lo」またはループバック インターフェイスに向かうパケットを確認できます。これらは、インターネット接続に関係なく機能します。

非常に古いプロトコルである Ping は、ICMP プロトコルを使用します。これは実際には UDP と同じネットワーク レイヤーの下のレイヤーか、おそらく同じレイヤーにあると思いますが、UDP メッセージではありません。

別のメンバーが質問にコメントしたように、送信先のポートでリッスンしているものがない場合、作成しているクライアントは失敗します。

「ping」コマンドの詳細については、こちらを参照してください。

詳細については編集 問題が発生していると思います-プレイクライアントには2つの異なるポート番号があり、クライアントはポート4997でソケットを作成し、サーバーはポート8117でソケットを作成しています.これは不一致の一部のようです.

私はあなたを正しい方向に向けるかもしれない簡単なグーグル検索をしました. 詳細については、この記事を参照してください。

私は何年も TCP/UDP レベルのものをプログラムしていないので、これ以上の実質的な情報を提供できないことをお詫びします。

于 2013-01-11T12:35:33.273 に答える