2

マルチキャスト アドレスに接続するネットワーク コードがいくつかありますが、数秒後に切断されます。このコードの何が問題なのか、誰でも理解できますか?

String Target_IP = "224.1.2.3"; 
int Target_Port = 31337;

IPEndPoint LocalEP = new IPEndPoint(IPAddress.Any, Target_Port);
IPEndPoint RemoteEP = new IPEndPoint(IPAddress.Parse(Target_IP), Target_Port); 

using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
    //s.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.NoDelay, 1);
    //s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
    s.Bind(LocalEP);
    s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 0);
    s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(Target_IP)));
    s.Connect(RemoteEP);

    // TODO
}

Connect() 関数が呼び出された後、接続済みとして報告されますが、1 ~ 2 秒待つと切断されます。間違ったポートなどにバインドしていますか? すべてのオンラインチュートリアルは、異なる方法でそれを行うようです.

4

1 に答える 1

2

UDP を使用しているため、リモート ターゲットに「接続」できません。コネクションレス プロトコルのConnectメソッドは、そのままでは接続しませんが、パケットを受け入れる宛先のフィルターとして機能します。

数秒後に切断すると言うとき、それをどのように判断していますか? ソケットの接続ステータスをチェックしている場合は、間違ったことをしています。代わりに、受信を開始するだけで、リモート ソケットが「切断された可能性がある」ことを伝える唯一の方法は、0 バイトのパケットを取得するか、そこから ICMP 応答を取得することです。

于 2009-08-28T03:25:42.117 に答える