2009-08-28 84 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()函数被调用后,它报告连接,但等待一两秒钟,并断开连接。我绑定到错误的端口或什么?每个在线教程似乎都采用了不同的方式。

回答

2

由于您使用UDP,因此无法“连接”到远程目标。关于无连接协议的Connect方法没有这样连接,而是作为一个过滤器来接受来自它的数据包。

当你说你在几秒钟后断开你如何确定?如果你正在检查插座上的连接状态,你做错了事情。相反,你应该开始接收,并且唯一的办法是告诉远程套接字“可能”已经下降,如果你得到一个0字节的数据包或者你从它得到一个ICMP响应。

+0

如果我尝试在没有连接功能的情况下发送数据,则会收到一条错误消息,内容为“由于套接字未连接且未提供地址,因此不允许发送或接收数据请求”。那么我怎么发送数据而不连接? – Nippysaurus 2009-08-28 04:18:19

+0

按照错误提示并指定要发送到http://msdn.microsoft.com/en-us/library/eae4f5y0.aspx的结束点。您在这里的关键是了解不同的方法.Net用于UDP和TCP。正如你已经发现的,Connect对于UDP和TCP意味着不同的事情。 – sipwiz 2009-08-28 05:01:08

+0

你给我的链接是UDP,但根本不包括多播。 – Nippysaurus 2009-08-28 06:31:24