C# — SocketOptionName.AddSourceMembership неизвестно, недопустимо или не поддерживается

Я пытаюсь реализовать Source-Specific Multicasting в С# (в основном, чтобы можно было свободно выбирать любой групповой адрес через Интернет, не рискуя конфликтом). Я следовал этому методу, но Я продолжаю сталкиваться с ошибкой:

в вызове getsockopt или setsockopt указана неизвестная недопустимая или неподдерживаемая опция или уровень

Это классическая ошибка, которая возникает, например, когда вы указываете SocketOptionLevel, который не соответствует SocketOptionName. Тем не менее, я проверил, что использую SocketOptionLevel.IP, который подходит для параметров многоадресной рассылки. Я также пробовал другие, которые вызывают ту же ошибку. Есть ли у вас какие-либо идеи о том, что еще может вызвать это исключение, или что я делаю неправильно?

Вот мой код:

mySocket = UdpClient(localEndPoint);

Buffer.BlockCopy(multicastGroupAddress.GetAddressBytes(), 0, membershipAddresses, 0, 4);
Buffer.BlockCopy(remoteEndPoint.Address.GetAddressBytes(), 0, membershipAddresses, 4, 4);
Buffer.BlockCopy(localEndPoint.Address.GetAddressBytes(), 0, membershipAddresses, 8, 4);

mySocket.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, membershipAddresses);

(Да, явно скопировано из ссылки, я все еще пытаюсь заставить ее работать)

Спасибо !


person DrZed    schedule 19.07.2018    source источник
comment
См. msdn: msdn.microsoft.com/en- us/library/ekd1t784(v=vs.110).aspx   -  person jdweng    schedule 19.07.2018
comment
Привет, jdweng, спасибо за ответ, но я уже проверил msdn, он хорошо документирован для классической многоадресной рассылки, но я не могу найти ни одного примера многоадресной рассылки для конкретного источника.   -  person DrZed    schedule 19.07.2018


Ответы (1)


Я получил следующий код для работы:

Socket mySocket = new Socket(AddressFamily.InterNetwork,
                     SocketType.Dgram,
                     ProtocolType.Udp);

// Join or create a multicast group
IPAddress multicastGroupAddress = IPAddress.Parse("224.1.1.1");

EndPoint localEndPoint  = (EndPoint)new IPEndPoint(IPAddress.Any, 2000);
mySocket.Bind(localEndPoint);
MulticastOption mcastOption = new MulticastOption(multicastGroupAddress);

mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOption);
person jdweng    schedule 19.07.2018
comment
Этот код отлично работает для многоадресной рассылки обычным способом. Я пытаюсь реализовать многоадресную рассылку Source-Specific. Это тип многоадресной рассылки, когда вы присоединяетесь к группе, указывая, из какого конкретного источника, который отправляет сообщения в группу, вы хотите получать дейтаграммы. Он должен использовать SocketOptionName.AddSourceMembership. Эта краткая статья в Википедии определяет его, Эта страница msdn, похоже, указывает, что этот параметр существует. - person DrZed; 19.07.2018
comment
Я проверил исходный код Microsoft и не вижу его реализации. Похоже, что Microsoft включила перечисление для параметра, а затем не реализовала никакого кода для его использования. - person jdweng; 19.07.2018
comment
Хорошо, большое спасибо за проверку. Я надеялся, что это сработало из-за другого вопрос, который, кажется, работает для этого парня, хотя я также нашел очень мало ссылок на него. - person DrZed; 19.07.2018
comment
Я не видел сообщений, указывающих на то, что AddSourceMembership действительно работает. - person jdweng; 19.07.2018
comment
На https://stackoverflow.com/questions/5145804/how-to-join-source-specific-multicast-group-in-c-sharp-igmpv3, в комментарии к ответу из постера вопроса говорится, что это работает - person DrZed; 19.07.2018
comment
Это было в 2011 году, и исходный код мог измениться. - person jdweng; 19.07.2018
comment
Хорошо, тогда я приму это к сведению. Поскольку AddSourceMembership все еще был частью перечисления, я предположил, что он все еще работает. Спасибо за ваше время и ответы! - person DrZed; 19.07.2018