[Mono-dev] Win32 sockets regression on trunk.
    Lucas Meijer 
    lucas at lucasmeijer.com
       
    Mon Feb 16 07:44:37 EST 2009
    
    
  
Hey.
While upgrading our mono to get all the latest bugfixes, I'm running into the following, which looks like a win32 socket regression.
When the program below is executed on mono trunk (r126917)
it outputs:
error on socket s
error on socket s2
available data on socket s
available data on socket s2
When run on a previous mono. (Mono2.0ish don't have the exact svn for this one, but around november 29, 2008), this program outputs:
available data on socket s2
Which seems to me like the correct output.
Reported as: https://bugzilla.novell.com/show_bug.cgi?id=476138
Here's the program. you need to make sure to actually have something listening on port 1234.
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
class Program
{
    static void Main(string[] args)
    {
        var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5655);
        s.Blocking = false;
        s.Bind(ep);
        s.Listen(5);
        var s2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        s2.Bind(new IPEndPoint(IPAddress.Any, 0));
        s2.Blocking = false;
        try
        {
            //You actally need to be running something on port 1234. 
            s2.Connect(IPAddress.Parse("127.0.0.1"), 1234); 
        }
        catch (SocketException se)
        {
            // ignore blocking connect exception. shouldn't there be some other way to do this...
            if (se.ErrorCode != 10035)
                throw se;
        }
        var errorList = new List<Socket>();
        var readList = new List<Socket>();
        var writeList = new List<Socket>();
        readList.Add(s);
        readList.Add(s2);
        errorList.Add(s);
        errorList.Add(s2);
        Socket.Select(readList, null, errorList, 100);
        if (errorList.Contains(s))
            Console.WriteLine("error on socket s");
        if (errorList.Contains(s2))
            Console.WriteLine("error on socket s2");
        if (readList.Contains(s))
            Console.WriteLine("available data on socket s");
        if (readList.Contains(s2))
            Console.WriteLine("available data on socket s2");
    }
}
-- Lucas Meijer | GameDev & Unity3D Consulting 
-- Blog: http://lucasmeijer.com/blog
-- twitter: lucasmeijer
    
    
More information about the Mono-devel-list
mailing list