? class/System/System.Net.Sockets/Socket-async-patch.txt Index: class/System/System.Net.Sockets/Socket.cs =================================================================== RCS file: /mono/mcs/class/System/System.Net.Sockets/Socket.cs,v retrieving revision 1.18 diff -u -r1.18 Socket.cs --- class/System/System.Net.Sockets/Socket.cs 31 Jul 2003 02:07:21 -0000 1.18 +++ class/System/System.Net.Sockets/Socket.cs 29 Dec 2003 02:29:07 -0000 @@ -26,6 +26,7 @@ private WaitHandle waithandle; private bool completed_sync, completed; private Worker worker; + private Exception delayedException = null; public SocketAsyncResult(object state) { this.state=state; @@ -33,6 +34,15 @@ completed_sync=completed=false; } + public void SetDelayedException (Exception e) { + delayedException = e; + } + + public void ThrowDelayedException () { + if (delayedException != null) + throw delayedException; + } + public object AsyncState { get { return(state); @@ -150,7 +160,11 @@ public void Connect() { lock(result) { if (socket.Blocking) { - socket.Connect(endpoint); + try { + socket.Connect(endpoint); + } catch (Exception e) { + result.SetDelayedException(e); + } End (); return; } @@ -218,17 +232,25 @@ public void Send() { lock(result) { - total=socket.Send(buffer, offset, size, - sockflags); + try { + total=socket.Send(buffer, offset, size, + sockflags); + } catch (Exception e) { + result.SetDelayedException(e); + } End(); } } public void SendTo() { lock(result) { - total=socket.SendTo(buffer, offset, - size, sockflags, - endpoint); + try { + total=socket.SendTo(buffer, offset, + size, sockflags, + endpoint); + } catch (Exception e) { + result.SetDelayedException(e); + } End(); } } @@ -721,6 +743,7 @@ SocketAsyncResult req=(SocketAsyncResult)result; result.AsyncWaitHandle.WaitOne(); + req.ThrowDelayedException(); } public int EndReceive(IAsyncResult result) { @@ -743,6 +766,7 @@ SocketAsyncResult req=(SocketAsyncResult)result; result.AsyncWaitHandle.WaitOne(); + req.ThrowDelayedException(); return(req.Worker.Total); } @@ -750,6 +774,7 @@ SocketAsyncResult req=(SocketAsyncResult)result; result.AsyncWaitHandle.WaitOne(); + req.ThrowDelayedException(); return(req.Worker.Total); }