几秒钟后,C#UDP组播断开连接 [英] C# UDP Multicast disconnects after a few seconds

查看:686
本文介绍了几秒钟后,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()函数后,它将报告为已连接,但要等待一两秒钟,然后断开连接.我绑定到错误的端口或其他东西了吗?每个在线教程似乎都采用不同的方式.

解决方案

由于使用的是UDP,因此无法连接"到远程目标.无连接协议上的 Connect 方法不会这样连接,但会一个可以接收目的地数据包的过滤器.

当您说几秒钟后断开连接时,如何确定呢?如果您正在检查套接字上的连接状态,那么您所做的事情是错误的.取而代之的是,您应该只是开始接收,并且告诉远程套接字可能"已断开的唯一方法是,如果您收到一个0字节的数据包,或者从中收到ICMP响应.

I have some networking code which connects to a multicast address but disconnects after a few seconds. Can anyone figure out what's wrong with this code?

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
}

After the Connect() function is called it reports as connected, but wait a second or two and it is disconnected. Am I binding to the wrong ports or something? Every online tutorial seems to do it a different way.

解决方案

Since you are using UDP you cannot "connect" to the remote target. The Connect method on connectionless protocols does not connect as such but acts as a filter on what destintations it will accept packets from.

When you say you disconnect after a few seconds how are you determining that? If you are checking th connected status on the socket you are doing the wrong thing. Instead you should just start receiving and the only way to tell that the remote socket "may" have dropped off is if you get a 0 byte packet or you get an ICMP response from it.

这篇关于几秒钟后,C#UDP组播断开连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆