static void RunCallback(IAnswerCallback callback, int errorCode) { ClientEngine.RunTask(() => { callback.OnException(null, errorCode); }); }
private void SendCompleted(object sender, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success && !beginClosing) { CloseByException("Send data to " + endpoint + " failed. Due to SocketError: " + e.SocketError, null, false); return; } currSendOffset += e.BytesTransferred; if (currSendOffset == currSendBuffer.Length) { currSendOffset = 0; lock (interLocker) { if (sendQueue.Count > 0) { currSendBuffer = sendQueue.Dequeue(); } else { currSendBuffer = null; return; } } } if (beginClosing) { return; } sendAsyncEventArgs.SetBuffer(currSendBuffer, currSendOffset, currSendBuffer.Length - currSendOffset); try { if (!socket.SendAsync(sendAsyncEventArgs)) { recursionDeepOfSendFunction += 1; if (recursionDeepOfSendFunction <= MaxRecursionDeepOfSendFunction) { SendCompleted(socket, sendAsyncEventArgs); } else { recursionDeepOfSendFunction = 0; ClientEngine.RunTask(() => { SendCompleted(socket, sendAsyncEventArgs); }); } } } catch (ObjectDisposedException ex) { CloseByException("Send data to " + endpoint + " exception. Connection is broken.", ex, true); } catch (SocketException ex) { CloseByException("Send data to " + endpoint + " exception. Access socket is error.", ex, false); } catch (InvalidOperationException) { //-- DO nothings } }
private void ConnectCompleted(object sender, SocketAsyncEventArgs e) { int unityDisCompliantSign = System.Threading.Interlocked.Exchange(ref connectCompletedSignForUnityIl2CPPDisCompliantImplement, 1); if (unityDisCompliantSign != 0) { if (e.SocketError != SocketError.Success) { lock (interLocker) { if (status == TCPClient.ClientStatus.Connecting) { requireClose = true; return; } else if (status == TCPClient.ClientStatus.Closed) { return; } } //-- status == TCPClient.ClientStatus.Connected Close(); } return; } if (e.SocketError != SocketError.Success) { if (errorRecorder != null && !requireClose) { errorRecorder.RecordError("Connect to " + endpoint + " failed. Due to SocketError: " + e.SocketError); } CloseWhenConnectingError(); return; } if (requireClose) { CallConnectionConnectedDelegate(0, false, "Connecting cannel event exception. Remote endpoint: " + endpoint + "."); connectionCloseDelegate = null; Close(); return; } receiveAsyncEventArgs.SetBuffer(receiver.buffer, receiver.offset, receiver.requireLength - receiver.offset); connectionId = socket.Handle.ToInt64(); CallConnectionConnectedDelegate(connectionId, true, "Connected event exception. Remote endpoint: " + endpoint + "."); lock (interLocker) { status = TCPClient.ClientStatus.Connected; } if (requireClose) { Close(); return; } if (ClientEngine.RegisterConnectedConnection(this) == false) { Close(); return; } CheckSending(); try { if (!socket.ReceiveAsync(receiveAsyncEventArgs)) { ReceiveCompleted(socket, receiveAsyncEventArgs); } } catch (ObjectDisposedException ex) { CloseByException("Receive data from " + endpoint + " exception. Connection is broken.", ex, true); } catch (SocketException ex) { CloseByException("Receive data from " + endpoint + " exception. Access socket is error.", ex, false); } catch (InvalidOperationException) { //-- Do nothings } }
private void ReceiveCompleted(object sender, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success && !beginClosing) { CloseByException("Receive data from " + endpoint + " failed. Due to SocketError: " + e.SocketError, null, false); return; } if (e.BytesTransferred == 0) { Close(); return; } receiver.offset += e.BytesTransferred; if (receiver.offset == receiver.requireLength) { Quest quest; Answer answer; try { receiver.Done(out quest, out answer); } catch (ReceiverErrorMessageException ex) { CloseByException("Processing received data from " + endpoint + " error: " + ex.Message + ". Connection will be closed.", null, false); return; } catch (Exception ex) { CloseByException("Processing received data from " + endpoint + " exception. Connection will be closed.", ex, false); return; } if (answer != null) { DealAnswer(answer); } else if (quest != null) { DealQuest(quest); } } if (beginClosing) { return; } receiveAsyncEventArgs.SetBuffer(receiver.buffer, receiver.offset, receiver.requireLength - receiver.offset); try { if (!socket.ReceiveAsync(receiveAsyncEventArgs)) { recursionDeepOfReceiveFunction += 1; if (recursionDeepOfReceiveFunction <= MaxRecursionDeepOfReceiveFunction) { ReceiveCompleted(socket, receiveAsyncEventArgs); } else { recursionDeepOfReceiveFunction = 0; ClientEngine.RunTask(() => { ReceiveCompleted(socket, receiveAsyncEventArgs); }); } } } catch (ObjectDisposedException ex) { CloseByException("Receive data from " + endpoint + " exception. Connection is broken.", ex, true); } catch (SocketException ex) { CloseByException("Receive data from " + endpoint + " exception. Access socket is error.", ex, false); } catch (InvalidOperationException) { //-- Do nothings } }
//----------------[ I/O Operations ]-----------------------// public void AsyncConnect(int connectTimeout) { lock (interLocker) { if (status != TCPClient.ClientStatus.Closed) { return; } status = TCPClient.ClientStatus.Connecting; } if (ClientEngine.RegisterConnectingConnection(this, connectTimeout) == false) { lock (interLocker) { status = TCPClient.ClientStatus.Closed; beginClosing = true; } CallConnectionConnectedDelegate(0, false, "Connecting cannel event exception. Remote endpoint: " + endpoint + "."); connectionCloseDelegate = null; socket.Close(); return; } connectionId = 0; receiver = new StandardReceiver(); sendAsyncEventArgs = new SocketAsyncEventArgs { RemoteEndPoint = endpoint }; sendAsyncEventArgs.Completed += IO_Completed; recursionDeepOfReceiveFunction = 0; recursionDeepOfSendFunction = 0; try { if (!socket.ConnectAsync(receiveAsyncEventArgs)) //-- Synchronous { ConnectCompleted(socket, receiveAsyncEventArgs); } else { lock (interLocker) { if (requireClose) { CannelConnecting(); } else { connectingCanBeCannelled = true; } } } } catch (SocketException e) { if (errorRecorder != null) { errorRecorder.RecordError("Connect to " + endpoint + " failed.", e); } CloseWhenConnectingError(); } catch (ObjectDisposedException e) { if (errorRecorder != null) { errorRecorder.RecordError("Connect to " + endpoint + " failed.", e); } CloseWhenConnectingError(); } }