void RemoveSession(IOCPSocketAsyncEventArgs args) { if (args.UserToken != null) { Session removesession; //用户断开了 if (_connectSocketDic.TryRemove(args.UserToken.ToString(), out removesession)) { RealseSocketAsyncEventArgs(args); } } else { RealseSocketAsyncEventArgs(args); } }
private void RealseSocketAsyncEventArgs(IOCPSocketAsyncEventArgs e) { e.Completed -= SocketAsyncEventArgs_Completed; _bufferpoll.RealseBuffer(e.BufferIndex); e.ClearBuffer(); //e.AcceptSocket.Disconnect(true); try { e.AcceptSocket.Shutdown(SocketShutdown.Send); } catch { } e.AcceptSocket.Close(); e.AcceptSocket = null; _iocpQueue.Enqueue(e); }
private SocketAsyncEventArgs GetSocketAsyncEventArgs() { IOCPSocketAsyncEventArgs args; if (_iocpQueue.TryDequeue(out args)) { args.Completed += Args_Completed; //args.ClearBuffer() args.IsReadPackLen = false; } else { args = new IOCPSocketAsyncEventArgs(); args.Completed += Args_Completed; } return(args); }
private void SetBuffer(IOCPSocketAsyncEventArgs e, int offset, int len) { if (offset > 0) { offset = (e.BufferIndex == -1 ? 0 : _bufferpoll.GetOffset(e.BufferIndex)) + offset; e.SetBuffer(offset, len); return; } byte[] buf = null; if (len <= _bufferpoll.BlockSize) { if (e.BufferIndex == -1) { var newindex = _bufferpoll.GetBuffer(); if (newindex == -1) { buf = new byte[len]; } else { e.BufferIndex = newindex; } } } else { if (e.BufferIndex > 0) { _bufferpoll.RealseBuffer(e.BufferIndex); e.BufferIndex = -1; } buf = new byte[len]; } if (buf != null) { e.SetBuffer(buf, offset, len); } else { e.SetBuffer(_bufferpoll.Buffer, _bufferpoll.GetOffset(e.BufferIndex) + offset, len); } }
private void SetBuffer(IOCPSocketAsyncEventArgs e, int offset, int len) { if (offset > 0) { e.SetBuffer(offset, len); return; } byte[] buf = null; if (len > _readbytes.Length) { buf = new byte[len]; e.SetBuffer(buf, offset, len); } else { e.SetBuffer(_readbytes, offset, len); } }
public bool StartClient() { lock (this) { try { if (socketClient != null && socketClient.Connected) { return(true); } if (DateTime.Now.Subtract(lastReStartClientTime).TotalMilliseconds <= reConnectClientTimeInterval) { return(false); } bool isResetClient = false; if (socketClient != null) { socketClient.Close(); isResetClient = true; } if (!string.IsNullOrWhiteSpace(encryKey)) { encryKey = string.Empty; } socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketClient.ReceiveBufferSize = 32000; socketClient.SendBufferSize = 32000; socketClient.NoDelay = true; try { if (socketAsyncEvent != null) { socketAsyncEvent.Completed -= socketAsyncEvent_Completed; } IPAddress connectip; if (!string.IsNullOrEmpty(serverIp)) { connectip = IPAddress.Parse(serverIp); } else { connectip = IPAddress.Any; } socketAsyncEvent = new IOCPSocketAsyncEventArgs(); socketAsyncEvent.Completed += socketAsyncEvent_Completed; socketAsyncEvent.RemoteEndPoint = new IPEndPoint(connectip, ipPort); _startSign.Reset(); socketClient.ConnectAsync(socketAsyncEvent); _startSign.WaitOne(30 * 1000); if (!socketClient.Connected) { throw new Exception("连接超时"); } if (isSecurity) { RsaEncryHelper.GenPair(out rsaPubKey, out rsaRrivateKey); var msg = new Message(MessageType.NEGOTIATIONENCRYR); encryKey = null; _startSign.Reset(); msg.SetMessageBody(new NegotiationEncryMessage { PublicKey = rsaPubKey }); socketClient.SendMessage(msg, string.Empty); _startSign.WaitOne(30 * 1000); if (string.IsNullOrWhiteSpace(encryKey)) { throw new Exception("协商加密失败"); } } } catch (SocketException e) { var ne = new Exception(string.Format("连接到远程服务器{0}失败,端口:{1},原因:{2},网络错误号:{3}", serverIp, ipPort, e.Message, e.SocketErrorCode)); throw ne; } catch (Exception e) { lastReStartClientTime = DateTime.Now; throw e; } isStartClient = true; if (isResetClient && OnClientReset != null) { OnClientReset(); } return(true); } catch (Exception e) { //OnError(e); return(false); } } }