https://bugzilla.novell.com/show_bug.cgi?id=661437
https://bugzilla.novell.com/show_bug.cgi?id=661437#c0 Summary: 2.8.1: Connect/Send logic on UDP sockets is throwing inappropriately Classification: Mono Product: Mono: Class Libraries Version: 2.8.x Platform: Macintosh OS/Version: Mac OS X 10.6 Status: NEW Severity: Normal Priority: P5 - None Component: System AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.612.3 Safari/534.15 This seems like a regression--code that was working with 2.6.7 is now failing with 2.8.1. The cases I discovered when investigating further are: If I use BeginSend() on a Connect()'ed multicast UDP socket, I get the following exception: Unhandled Exception: System.Net.Sockets.SocketException: The socket is not connected at System.Net.Sockets.Socket.BeginSend (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags socket_flags, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 at Test.TestAsyncSend () [0x00000] in <filename unknown>:0 at Test.Main (System.String[] args) [0x00000] in <filename unknown>:0 If I use BeginSendTo() on a Connect()'ed multicast UDP socket, I get the following exception: Unhandled Exception: System.Net.Sockets.SocketException: Socket is already connected at System.Net.Sockets.Socket.SendTo_nochecks (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at System.Net.Sockets.Socket+Worker.SendTo () [0x00000] in <filename unknown>:0 if I use SendTo() on a Connect()'ed multicast UDP socket, I get the following exception: Unhandled Exception: System.Net.Sockets.SocketException: Socket is already connected at System.Net.Sockets.Socket.SendTo_nochecks (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at System.Net.Sockets.Socket.SendTo (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at Test.TestConnectedSyncSendTo () [0x00000] in <filename unknown>:0 at Test.Main (System.String[] args) [0x00000] in <filename unknown>:0 I made a test program to test six combinations of system calls. The failure cases are asyncsend, connectedsyncsendto, connectasyncsendto. The other three test cases work as expected. I would expect all six to work. $ cat udp.cs using System; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; class Test { enum Mode { SyncSend, SyncSendTo, AsyncSend, AsyncSendTo, ConnectedSyncSendTo, ConnectedAsyncSendTo } static byte[] buf = new byte[40]; static void Usage() { Console.Error.WriteLine("Usage mono udp.exe <mode> where <mode> is one of:"); Console.Error.WriteLine(" syncsend - use socket.Send()"); Console.Error.WriteLine(" syncsendto - use socket.SendTo()"); Console.Error.WriteLine(" connectedsyncsendto - use socket.SendTo() on a Connect()'ed socket"); Console.Error.WriteLine(" asyncsend - use socket.BeginSend()"); Console.Error.WriteLine(" asyncsendto - use socket.BeginSendTo()"); Console.Error.WriteLine(" connectedasyncsendto - use socket.BeginSendTo() on a Connect()'ed socket"); } static void TestSyncSend() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { sock.Connect(new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002)); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); while (true) { Console.WriteLine("Send()"); sock.Send(buf, 0, buf.Length, 0); Thread.Sleep(1000); } } } static void TestConnectedSyncSendTo() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); EndPoint ep = new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002); sock.Connect(ep); while (true) { Console.WriteLine("SendTo()"); sock.SendTo(buf, 0, buf.Length, 0, ep); Thread.Sleep(1000); } } } static void TestSyncSendTo() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); EndPoint ep = new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002); while (true) { Console.WriteLine("SendTo()"); sock.SendTo(buf, 0, buf.Length, 0, ep); Thread.Sleep(1000); } } } static void TestAsyncSend() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { sock.Connect(new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002)); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); while (true) { Console.WriteLine("BeginSend()"); sock.BeginSend(buf, 0, buf.Length, 0, ar => { Console.WriteLine(" ==> EndSend()"); sock.EndSend(ar); }, null); Thread.Sleep(1000); } } } static void TestConnectedAsyncSendTo() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { IPEndPoint ep = new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002); sock.Connect(ep); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); while (true) { Console.WriteLine("BeginSendTo()"); sock.BeginSendTo(buf, 0, buf.Length, 0, ep, ar => { Console.WriteLine(" ==> EndSendTo()"); sock.EndSendTo(ar); }, null); Thread.Sleep(1000); } } } static void TestAsyncSendTo() { using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { IPEndPoint ep = new IPEndPoint(IPAddress.Parse("239.255.255.249"), 9002); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); while (true) { Console.WriteLine("BeginSendTo()"); sock.BeginSendTo(buf, 0, buf.Length, 0, ep, ar => { Console.WriteLine(" ==> EndSendTo()"); sock.EndSendTo(ar); }, null); Thread.Sleep(1000); } } } public static int Main(string[] args) { Mode mode; try { mode = (Mode)Enum.Parse(typeof(Mode), args[0], true); } catch { Usage(); return 1; } switch (mode) { case Mode.SyncSend: TestSyncSend(); break; case Mode.SyncSendTo: TestSyncSendTo(); break; case Mode.ConnectedSyncSendTo: TestConnectedSyncSendTo(); break; case Mode.AsyncSend: TestAsyncSend(); break; case Mode.AsyncSendTo: TestAsyncSendTo(); break; case Mode.ConnectedAsyncSendTo: TestConnectedAsyncSendTo(); break; } return 0; } } to run: $ gmcs udp.cs && mono udp.exe asyncsend BeginSend() Unhandled Exception: System.Net.Sockets.SocketException: The socket is not connected at System.Net.Sockets.Socket.BeginSend (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags socket_flags, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 at Test.TestAsyncSend () [0x00000] in <filename unknown>:0 at Test.Main (System.String[] args) [0x00000] in <filename unknown>:0 $ gmcs udp.cs && mono udp.exe connectedasyncsendto [ 130 ] BeginSendTo() ==> EndSendTo() Unhandled Exception: System.Net.Sockets.SocketException: Socket is already connected at System.Net.Sockets.Socket.SendTo_nochecks (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at System.Net.Sockets.Socket+Worker.SendTo () [0x00000] in <filename unknown>:0 $ gmcs udp.cs && mono udp.exe connectedsyncsendto [ 255 ] SendTo() Unhandled Exception: System.Net.Sockets.SocketException: Socket is already connected at System.Net.Sockets.Socket.SendTo_nochecks (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at System.Net.Sockets.Socket.SendTo (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags flags, System.Net.EndPoint remote_end) [0x00000] in <filename unknown>:0 at Test.TestConnectedSyncSendTo () [0x00000] in <filename unknown>:0 at Test.Main (System.String[] args) [0x00000] in <filename unknown>:0 Reproducible: Always -- 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. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
