[Mono-bugs] [Bug 643475] New: Socket.ExclusiveAddressUse not working with UDP

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Mon Oct 4 07:02:06 EDT 2010


https://bugzilla.novell.com/show_bug.cgi?id=643475

https://bugzilla.novell.com/show_bug.cgi?id=643475#c0


           Summary: Socket.ExclusiveAddressUse not working with UDP
    Classification: Mono
           Product: Mono: Class Libraries
           Version: 2.6.x
          Platform: i586
        OS/Version: openSUSE 11.3
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: CORLIB
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: djechelon at fastwebnet.it
         QAContact: mono-bugs at lists.ximian.com
                CC: vittorioalfieri at gmail.com
          Found By: Community User
           Blocker: Yes


Description of Problem:
I need to open a UDP socket listener in a known range of ports. This eases
firewall configuration for servers.
In order to achieve this, I need to set the ExclusiveAddressUse either on
UdpClient or on its underlying Client member (of type Socket) before binding.

The following code fragment works well on Windows (.NET 3.5), even without
Admin privileges (MSDN states that in certain Windows version you need to be
admin to set that flag), but doesn't work in Mono, root or not

for (int i = START_PORT; i <= END_PORT; i++)
                {
                    try
                    {
                        Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp) { ExclusiveAddressUse = true };
                        socket.Bind(new IPEndPoint(localIp, i));

                        _client = new UdpClient { Client = socket };
                        break;
                    }
                    catch (SocketException)
                    { }
                }

The code works as follows: it tries to open a socket on the first port, but if
another process (or another class within the process) opened the same port, it
will throw a SocketException and try with the next. The code obviously fails if
all ports are taken by other processes (I allocated 5000 ports).


Steps to reproduce the problem:
1. Instantiate a new socket and set ExclusiveAddressUse to true
2. Try to bind it to a free local port


Actual Results:
System.Net.Sockets.SocketException: Protocol option not supported
  at System.Net.Sockets.Socket.SetSocketOption (SocketOptionLevel optionLevel,
SocketOptionName optionName, Int32 optionValue) [0x00046] in
/usr/src/packages/BUILD/mono-2.6.7/mcs/class/System/System.Net.Sockets/Socket_2_1.cs:719 
  at System.Net.Sockets.Socket.set_ExclusiveAddressUse (Boolean value)
[0x0003d] in
/usr/src/packages/BUILD/mono-2.6.7/mcs/class/System/System.Net.Sockets/Socket.cs:861 
  at It.Unina.Dis.Logbus.Clients.UdpLogClientImpl.Start () [0x00072] in
/home/sviluppo/logbus-benchmark/It.Unina.Dis.Logbus/Clients/UdpLogClientImpl.cs:195 

Expected Results:
Client should bind to the first available port in the assigned range

How often does this happen? 
Always

Additional Information:
Full source code
http://logbus-ng.svn.sourceforge.net/viewvc/logbus-ng/trunk/logbus-core/It.Unina.Dis.Logbus/Clients/UdpLogClientImpl.cs?view=log&pathrev=393

line 191 and following

Workaround coming in the next comment

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list