[Mono-bugs] [Bug 79878][Maj] New - BeginConnect/EndConnect for Socket does not work correctly on connection error
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Thu Nov 9 11:43:48 EST 2006
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by odie at cs.aau.dk.
http://bugzilla.ximian.com/show_bug.cgi?id=79878
--- shadow/79878 2006-11-09 11:43:48.000000000 -0500
+++ shadow/79878.tmp.9637 2006-11-09 11:43:48.000000000 -0500
@@ -0,0 +1,84 @@
+Bug#: 79878
+Product: Mono: Class Libraries
+Version: 1.1
+OS:
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Major
+Component: System
+AssignedTo: mono-bugs at ximian.com
+ReportedBy: odie at cs.aau.dk
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: BeginConnect/EndConnect for Socket does not work correctly on connection error
+
+Description of Problem:
+When trying to connect a Socket instance asynchronously and the attempt
+fails for whatever reason, the connected bit is set true when it should be
+false.
+
+Steps to reproduce the problem:
+Run attached test case (tcp socket 1234 on localhost should be closed so
+the attempt to connect fails).
+
+Actual Results:
+socket.Connected is true when Callback is invoked, even though the
+connection failed, as the test case shows.
+
+Expected Results:
+When the callback registered with BeginConnect is invoked, Connected should
+be false if some error happened. Output for test case should thus be
+socket connected False, op completed True
+Hit key to end:
+
+How often does this happen?
+Failure is 100% reproduceable on mono 1.1.something and current svn and
+work as expected on .Net.
+
+Additional Information:
+Comments to code snippets from mcs/class/System/System.Net.Socket/Socket.cs:
+(line 288-299)
+ public void Connect ()
+ {
+ try {
+ if (!result.Sock.Blocking) {
+ result.Sock.Poll (-1, SelectMode.SelectWrite);
+ int success = (int)result.Sock.GetSocketOption
+(SocketOptionLevel.Socket, SocketOptionName.Error);
+ if (success == 0) {
+ result.Sock.connected = true;
+ } else {
+ result.Complete (new SocketException (success));
+ return;
+ }
+[...]
+On instantiation of a Socket, connected is false. Connect calls Poll, which
+the snippet from below is from. I don't believe connected should be set
+true here, because the result of Poll_internal doesn't say whether the
+socket is connected or not that is reflected by GetSocketOption it seems
+from the code above.
+(line 1344-1358)
+ int error;
+ bool result = Poll_internal (socket, mode, time_us, out error);
+ if (error != 0)
+ throw new SocketException (error);
+
+ if (result == true) {
+ /* Update the connected state; for
+ * non-blocking Connect()s this is
+ * when we can find out that the
+ * connect succeeded.
+ */
+ connected = true;
+ }
+
+ return result;
+[...]
+
+So from the point of solving my problem, removing connected = true; from
+Poll works (I tested it). If other relies on Poll setting connected I guess
+Poll could call GetSocketOption like Connect does.
More information about the mono-bugs
mailing list