2009-08-28 29 views
2

マルチキャストアドレスに接続するネットワークコードがありますが、数秒後に切断されます。誰でもこのコードの何が間違っているのか理解できますか?C#UDP数秒後にマルチキャストが切断される

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秒待って接続が切断されます。私は間違ったポートや何かにバインドしていますか?すべてのオンラインチュートリアルは、それを別の方法で行うようです。

答えて

2

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

あなたが数秒後に接続を解除すると、どのようにそれを判断していますか?ソケットの接続状態をチェックしている場合は、間違ったことをしています。代わりに、受信を開始するだけで、リモートソケットが "落ちている"ことを知らせる唯一の方法は、0バイトのパケットが得られた場合、またはICMP応答を取得した場合です。

+0

接続機能を使用せずにデータを送信しようとすると、「ソケットが接続されておらず、アドレスが指定されていないため、データの送受信が許可されませんでした」というエラーが表示されます。だから私はどのように私は接続せずにデータを送信する? – Nippysaurus

+0

エラーが表示されるのを行い、http://msdn.microsoft.com/en-us/library/eae4f5y0.aspxに送信するエンドポイントを指定します。ここでの鍵は、.NetがUDPとTCPに使用するさまざまなアプローチを理解することです。あなたがすでに見つけたように、ConnectはUDPとTCPのために異なることを意味します。 – sipwiz

+0

あなたが私に渡したリンクはUDP用ですが、マルチキャスティングはまったく対象としていません。 – Nippysaurus

関連する問題