//Event private void Base_OnConnected(object sender, SocketAsyncEventArgs e) { if (e != null) { if (e.SocketError != SocketError.Success) { if (socket != null) { socket.Close(); socket = null; } lock (stateLock) state = GClientState.Disconnected; OnFatalError(new SocketException((int)e.SocketError)); return; } e.Dispose(); } lock (stateLock) state = GClientState.Connected; receiveEventArgs.SetBuffer(header, 0, header.Length); receiveEventArgs.Completed += Base_OnHeaderReceived; OnConnected(); try { if (!socket.ReceiveAsync(receiveEventArgs)) { Base_OnHeaderReceived(socket, receiveEventArgs); } } catch (Exception ex) { DisconnectByError(ex); } }
private bool DisconnectedJob() { lock (stateLock) { if (state != GClientState.Connected) { return(false); } state = GClientState.Disconnecting; } lock (globalLock) { try { socket.Shutdown(SocketShutdown.Both); } catch { } socket.Close(); socket = null; lock (stateLock) state = GClientState.Disconnected; } return(true); }
public bool Connect(IPEndPoint serverEndPoint, bool useAsync = false, int timeout = 3000) { //Change state lock (stateLock) { if (state != GClientState.Disconnected) { throw new Exception("Socket already connected."); } state = GClientState.Connecting; this.serverEndPoint = serverEndPoint; } Reset(); //Socket setting Exception socketSettingException = null; lock (globalLock) { try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.NoDelay = socketArgs.noDelay; socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(socketArgs.useLinger, socketArgs.lingerTime)); byte[] optionBuffer = new byte[12]; Array.Copy(BitConverter.GetBytes(socketArgs.useKeepAlive ? 1 : 0), 0, optionBuffer, 0, sizeof(int)); Array.Copy(BitConverter.GetBytes(socketArgs.keepAliveTime), 0, optionBuffer, sizeof(int), sizeof(int)); Array.Copy(BitConverter.GetBytes(socketArgs.keepAliveInterval), 0, optionBuffer, sizeof(int) * 2, sizeof(int)); try { socket.IOControl(IOControlCode.KeepAliveValues, optionBuffer, null); } catch { socketArgs.useKeepAlive = false; } } catch (Exception ex) { if (socket != null) { socket.Close(); socket = null; } lock (stateLock) state = GClientState.Disconnected; socketSettingException = ex; } } if (socketSettingException != null) { lock (stateLock) { state = GClientState.Disconnected; } OnFatalError(socketSettingException); return(false); } //Connect SocketAsyncEventArgs connectEventArgs = null; try { if (useAsync) { //Async connectEventArgs = new SocketAsyncEventArgs(); connectEventArgs.Completed += Base_OnConnected; connectEventArgs.RemoteEndPoint = serverEndPoint; if (!socket.ConnectAsync(connectEventArgs)) { //비동기 완료 Base_OnConnected(socket, connectEventArgs); } else { CancelAsyncConnect(timeout); } } else { //Blocking IAsyncResult result = socket.BeginConnect(serverEndPoint, null, null); bool success = result.AsyncWaitHandle.WaitOne(timeout, true); if (socket.Connected) { Base_OnConnected(socket, null); } else { lock (stateLock) { state = GClientState.Disconnected; } return(false); } } } catch (Exception ex) { lock (stateLock) { state = GClientState.Disconnected; } OnFatalError(ex); return(false); } return(true); }