UdpClient Stop Receiving Broadcast Datagram On Lan When Connect to Internet

G

greenxiar

My code is below and the platform is Win2K3 R2:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TechUDPBroadcast {
class Program {
static void Main(string[] args) {
const string addr = "224.1.3.99";
const int prt = 12799;

UdpClient udpc = new UdpClient();
udpc.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress, true);
udpc.Client.Bind(new IPEndPoint(IPAddress.Any, prt));
udpc.EnableBroadcast = true;

udpc.JoinMulticastGroup(IPAddress.Parse(addr));

ManualResetEvent abort = new ManualResetEvent(false);
WaitHandle[] evs = new WaitHandle[2];
evs[0] = abort;
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate {
while (true) {
IAsyncResult asy = udpc.BeginReceive(
new AsyncCallback(delegate(IAsyncResult iasy) {
IPEndPoint rp = null;
byte[] recv = udpc.EndReceive(iasy, ref rp);
Console.Write(".");
}), null);
evs[1] = asy.AsyncWaitHandle;
if (WaitHandle.WaitAny(evs) == 0) return;
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate {
for (int i = 0; i < 1000; i++) {
udpc.Send(new byte[] { 0x1, 0x2 }, 2,
new IPEndPoint(IPAddress.Parse(addr), prt));
Console.Write("+");
Thread.Sleep(1000);
if (abort.WaitOne(0, false)) return;
}
}));
Console.ReadKey();
Abort.Set();
}
}
}

The code is simple and has no tricky. UdpClient broadcast
datagram every second, another thread receive it asynchorously.
When it is running at LAN, sending & receiving are OK.
Then i connect the PC to Internet, the UdpClient stop receiving!
This happened with or without Windows FireWall.

Is this a bug of DotNetFramework?

greenxiar
 
G

greenxiar

Sorry. two line cause the problem

udpc.Client.Bind(new IPEndPoint(IPAddress.Any, prt));
udpc.JoinMulticastGroup(IPAddress.Parse(addr));

The UdpClient can only receive and send multicast datagrams
to only "ONE" binded IPAddress. If there are more than
one network connection as PPPOE or second NIC,
you will not sure which IPAddress is sending or listening.

So the answer is

udpc.Client.Bind(new IPEndPoint([localAddress], [localPort]));
udpc.JoinMulticastGroup(IPAddress.Parse([multicastAddress]),
[localAddress]);
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top