C # UDP Multicast отключается через несколько секунд - PullRequest
2 голосов
/ 28 августа 2009

У меня есть сетевой код, который подключается к многоадресному адресу, но отключается через несколько секунд. Может кто-нибудь выяснить, что не так с этим кодом?

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 голосов
/ 28 августа 2009

Поскольку вы используете UDP, вы не можете «подключиться» к удаленной цели. Метод Connect для протоколов без установления соединения не подключается как таковой, но действует как фильтр для тех мест назначения, от которых он будет принимать пакеты.

Когда вы говорите, что отключаетесь через несколько секунд, как вы это определяете? Если вы проверяете состояние соединения на сокете, вы делаете не то, что нужно. Вместо этого вы должны просто начать получать, и единственный способ сказать, что удаленный сокет «может» пропал, - это если вы получили 0-байтовый пакет или получили от него ответ ICMP.

...