private void Disconnect(bool forceCallback) { _lastSocketError = SocketResultCode.OK; bool wasConnected; lock (this) { if (null == _socket) { return; } wasConnected = _socket.Connected; try { _socket.Shutdown(SocketShutdown.Both); } catch (ObjectDisposedException) { // EMPTY } catch (SocketException e) { _lastSocketError = SocketTools.NativeToSocketError(e.NativeErrorCode); } _socket.Close(); _socket = null; System.Threading.Thread.Yield(); } if (wasConnected || forceCallback) { OnDisconnected(); } }
private void OnConnectCallback(IAsyncResult ar) { var sock = (Socket)ar.AsyncState; try { sock.EndConnect(ar); } catch (ObjectDisposedException) { OnConnectFailed(SocketResultCode.SocketNotAvailableAnymore); return; } catch (SocketException e) { OnConnectFailed(SocketTools.NativeToSocketError(e.NativeErrorCode)); return; } if (!sock.Connected) { OnConnectFailed(SocketResultCode.CantConnect); return; } OnConnected(); var res = StartReceive(); if (res == SocketResultCode.OK) { return; } OnSocketError(res, _lastSocketError); Disconnect(); }
private SocketResultCode StartAccept(Socket socket) { try { socket.BeginAccept(OnAcceptCallback, socket); } catch (ObjectDisposedException) { return(SocketResultCode.SocketNotAvailableAnymore); } catch (SocketException e) { return(SocketTools.NativeToSocketError(e.NativeErrorCode)); } catch (InvalidOperationException) { return(SocketResultCode.CantStartListener); } catch (NotSupportedException) { return(SocketResultCode.NotSupportedOnOS); } return(SocketResultCode.OK); }