diff options
Diffstat (limited to 'mcs/class/System/System.Net.Sockets')
-rw-r--r-- | mcs/class/System/System.Net.Sockets/ChangeLog | 26 | ||||
-rw-r--r-- | mcs/class/System/System.Net.Sockets/Socket.cs | 61 |
2 files changed, 75 insertions, 12 deletions
diff --git a/mcs/class/System/System.Net.Sockets/ChangeLog b/mcs/class/System/System.Net.Sockets/ChangeLog index 3b7aeaf5da9..7da5dcdae61 100644 --- a/mcs/class/System/System.Net.Sockets/ChangeLog +++ b/mcs/class/System/System.Net.Sockets/ChangeLog @@ -1,3 +1,29 @@ +2004-08-04 Dick Porter <dick@ximian.com> + + * Socket.cs: Update Connected state in Select and Poll; this is + when we find out that non-blocking Connects succeed. Fixes bug + 62398. + +2004-07-28 Dick Porter <dick@ximian.com> + + * Socket.cs: ReceiveFrom might not return a valid EndPoint. Patch + by Nick Vaughan (dev@6wardlaw.freeserve.co.uk), fixes bug 61608. + +2004-07-15 Dick Porter <dick@ximian.com> + + * Socket.cs: Don't try and dereference a null array in Select() + (possible if a descriptor list of length 0 was passed.) Patch by + Nick Vaughan (dev@6wardlaw.freeserve.co.uk), fixes bug 61595. + +2004-07-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * Socket.cs: if'ed RemoveReferences calls. + +2004-07-09 Dick Porter <dick@ximian.com> + + * Socket.cs: Slight tweak to allow unknown objects to be returned + by GetSocketOption(). + 2004-06-28 Gonzalo Paniagua Javier <gonzalo@ximian.com> * Socket.cs: connect on non-blocking sockets returns EINPROGRESS. Fixes diff --git a/mcs/class/System/System.Net.Sockets/Socket.cs b/mcs/class/System/System.Net.Sockets/Socket.cs index a7fa184ccae..88ca77436b5 100644 --- a/mcs/class/System/System.Net.Sockets/Socket.cs +++ b/mcs/class/System/System.Net.Sockets/Socket.cs @@ -422,24 +422,39 @@ namespace System.Net.Sockets throw new SocketException (error); } + /* Make sure the connected state is updated + * for each socket returned from the select; + * for non blocking Connect()s, this is when + * we find out that the connect succeeded. + */ + if(read_list!=null) { read_list.Clear(); - for(i=0; i<read_arr.Length; i++) { - read_list.Add(read_arr[i]); + if (read_arr != null) { + for(i=0; i<read_arr.Length; i++) { + read_list.Add(read_arr[i]); + read_arr[i].connected = true; + } } } if(write_list!=null) { write_list.Clear(); - for(i=0; i<write_arr.Length; i++) { - write_list.Add(write_arr[i]); + if (write_arr != null) { + for(i=0; i<write_arr.Length; i++) { + write_list.Add(write_arr[i]); + write_arr[i].connected = true; + } } } if(err_list!=null) { err_list.Clear(); - for(i=0; i<err_arr.Length; i++) { - err_list.Add(err_arr[i]); + if (err_arr != null) { + for(i=0; i<err_arr.Length; i++) { + err_list.Add(err_arr[i]); + err_arr[i].connected = true; + } } } } @@ -1020,7 +1035,9 @@ namespace System.Net.Sockets if (req == null) throw new ArgumentException ("Invalid IAsyncResult", "result"); - RemoveReference (req); + if (supportsAsync && socket_type == SocketType.Stream) + RemoveReference (req); + if (!result.IsCompleted) result.AsyncWaitHandle.WaitOne(); @@ -1063,7 +1080,9 @@ namespace System.Net.Sockets if (req == null) throw new ArgumentException ("Invalid IAsyncResult", "result"); - RemoveReference (req); + if (supportsAsync && socket_type == SocketType.Stream) + RemoveReference (req); + if (!result.IsCompleted) result.AsyncWaitHandle.WaitOne(); @@ -1131,8 +1150,10 @@ namespace System.Net.Sockets } else if (name==SocketOptionName.AddMembership || name==SocketOptionName.DropMembership) { return((MulticastOption)obj_val); - } else { + } else if (obj_val is int) { return((int)obj_val); + } else { + return(obj_val); } } @@ -1224,6 +1245,15 @@ namespace System.Net.Sockets 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; } @@ -1372,10 +1402,17 @@ namespace System.Net.Sockets } connected = true; + + // If sockaddr is null then we're a connection + // oriented protocol and should ignore the + // remote_end parameter (see MSDN + // documentation for Socket.ReceiveFrom(...) ) - // Stupidly, EndPoint.Create() is an - // instance method - remote_end = remote_end.Create (sockaddr); + if ( sockaddr != null ) { + // Stupidly, EndPoint.Create() is an + // instance method + remote_end = remote_end.Create (sockaddr); + } return cnt; } |