public async Task<bool> Open(string address = null, int port = -1) { try { IPEndPoint server = new IPEndPoint(IPAddress.Parse(_address), _port); SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SocketFlags = SocketFlags.None; args.RemoteEndPoint = server; var awaitable = new SocketAwaitable(args); awaitable.OnCompleted(() => { RaiseConnected(); //Flush(); //Receive(); }); _socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await _socket.ConnectAsync(awaitable); return awaitable.IsCompleted; } catch (Exception ex) { RaiseError(ex); throw; } }
public async Task<bool> Close() { try { if (_socket != null && _socket.Connected) { await Flush(); _socket.Shutdown(SocketShutdown.Both); SocketAsyncEventArgs args = new SocketAsyncEventArgs(); var awaitable = new SocketAwaitable(args); awaitable.OnCompleted(() => { RaiseDisconnected(); // cancel pending receives }); await _socket.DisconnectAsync(awaitable); return !awaitable.IsCompleted; } return false; } catch (Exception ex) { RaiseError(ex); throw; } }
public async Task<bool> Flush() { try { if (_socket == null) return false; if (_tosend.IsEmpty) return false; byte[] data; while (_tosend.TryDequeue(out data)) { SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(data, 0, data.Length); var awaitable = new SocketAwaitable(args); awaitable.OnCompleted(() => { RaiseSent(awaitable.GetResult()); }); await _socket.SendAsync(awaitable); } return true; } catch (Exception ex) { RaiseError(ex); throw; } }