Multicast Socket Configuration for Pub/Sub
Unfortunately, I'm unable to comment about the actual options you are setting since


while I've used Sockets in Java, I haven't used them in C#
I'm finding it a bit hard to see what your code is doing because it isn't very expressive


So, while I can do nothing about the first point (someone with more experience will have to help you out), we can certainly remedy the second problem by refactoring your code into a more readable form with less duplication.

Let's start by declaring a new member variable to keep hold of the parsed IP address:

private static IPAddress _ipAddress = IPAddress.Parse(_configuration.Server.AddressV4);


We'll use this field in the methods that result from splitting up your monolithic function into several helpers, leaving us with the following:

_broadcastSocket = CreateBroadcastSocket();
_broadcastListeningSocket = CreateBroadcastListeningSocket(); 
_broadcastSocket.Connect(GetEndpointOf(_ipAddress));
_broadcastListeningSocket.Bind(GetEndpointOf(IPAddress.Any));


Those methods are defined as the following:

private static Socket CreateBroadcastSocket()
{
    Socket s = CreateSocket(new MulticastOption(_ipAddress));
    s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, _configuration.Server.TimeToLive);
    return s;
}

private static Socket CreateBroadcastListeningSocket()
{
    return CreateSocket(new MulticastOption(_ipAddress, IPAddress.Any));
}

private static Socket CreateSocket(MulticastOption multicastOption)
{
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, false);
    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
    s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, multicastOption);
    return s;
}


Note that it would have been possible to set the instance variables (_broadcastListeningSocketand _broadcastSocket) directly from the helper methods, instead of returning a new Socket, however I find the above implementation more expressive because we seperate the concerns: The helper methods know about how to create a configured Socket, while the method that calls them knows about what they have to be assigned to.

What to do if you find out you need to set the options differently?


Create a new CreateXXXSocket() method
From that method, call CreateSocket() and
configure the result and pass it back to the caller