private static byte[] ReceivingNext(Socket s) { int readLen = 0, timeout = 0, count = 0; byte[] buff4 = new byte[4]; s.Receive(buff4, 0, 4, SocketFlags.None); int dataLen = BitConverter.ToInt32(buff4, 0); s.Receive(buff4, 0, 4, SocketFlags.None); var crc32 = BitConverter.ToInt32(buff4, 0); //MemoryStream ms = new MemoryStream(); readLen = 0; timeout = 0; dataLen -= 4; byte[] buffer = new byte[dataLen]; //if (SocketApplicationEnvironment.TraceSocketDataBag) //{ // LogManager.LogHelper.Instance.Debug(s.Handle + "准备接收数据:" + dataLen); //} while (readLen < dataLen) { count = s.Receive(buffer, readLen, dataLen - readLen, SocketFlags.None); if (count == 0) { Thread.Sleep(1); timeout += 1; if (timeout > 10000) { break; } continue; } readLen += count; } var calcrc32 = HashEncrypt.GetCRC32(buffer, 0); if (calcrc32 != crc32) { Exception ex = new Exception("检查校验码出错"); ex.Data.Add("crc32", crc32); ex.Data.Add("calcrc32", calcrc32); ex.Data.Add("data", Convert.ToBase64String(buffer)); //LogManager.LogHelper.Instance.Error("接收数据错误", ex); } //if (SocketApplicationEnvironment.TraceSocketDataBag) //{ // LogManager.LogHelper.Instance.Debug(s.Handle + "接收数据," + readLen + "," + Convert.ToBase64String(buffer)); //} return(buffer); }
void socketAsyncEvent_Completed(object sender, SocketAsyncEventArgs e) { e.Completed -= socketAsyncEvent_Completed; var args = e as IOCPSocketAsyncEventArgs; if (e.LastOperation == SocketAsyncOperation.Connect) { if (e.SocketError == SocketError.Success) { socketClient = e.ConnectSocket; _startSign.Set(); //e.SetBuffer(_lenbyte, 0, 4); SetBuffer(args, 0, 4); } else { //throw new Exception("连接失败:" + e.SocketError); } } else { if (args.BytesTransferred == 0 || args.SocketError != SocketError.Success) { Dispose(); return; } else { if (!args.IsReadPackLen) { for (int i = 0; i < _lenbyte.Length; i++) { _lenbyte[i] = e.Buffer[i]; } int dataLen = BitConverter.ToInt32(_lenbyte, 0); if (dataLen > MaxPackageLength) { Dispose(); return; } else { args.IsReadPackLen = true; //byte[] readbuffer = new byte[dataLen]; args.BufferLen = dataLen; args.BufferRev = 0; //args.SetBuffer(readbuffer, 0, dataLen); SetBuffer(args, 0, dataLen); } } else { args.BufferRev += args.BytesTransferred; if (args.BufferRev == args.BufferLen) { //检验 byte[] bt4 = e.Buffer.Take(4).ToArray(); var crc32 = BitConverter.ToInt32(bt4, 0); byte[] bt = new byte[args.BufferLen - 4]; for (int i = 0; i < bt.Length; i++) { bt[i] = e.Buffer[i + 4]; } var calcrc32 = HashEncrypt.GetCRC32(bt, 0); if (calcrc32 != crc32) { var ex = new Exception("数据校验错误"); ex.Data.Add("calcrc32", calcrc32); ex.Data.Add("crc32", crc32); ex.Data.Add("data", Convert.ToBase64String(bt)); OnError(ex); } else { ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessMessage), bt); } args.IsReadPackLen = false; //args.SetBuffer(_lenbyte, 0, 4); SetBuffer(args, 0, 4); } else { e.SetBuffer(args.BufferRev, args.BufferLen - args.BufferRev); } } } } e.Completed += socketAsyncEvent_Completed; if (e.SocketError == SocketError.Success) { socketClient.ReceiveAsync(e); //if (!socketClient.ReceiveAsync(e)) //{ // e.Completed -= socketAsyncEvent_Completed; //} } }
public static int SendMessage(this Socket s, Message message, string encrykey) { try { if (s == null) { return(0); } byte[] data = null; int bufferindex = -1; long size = 0; if (string.IsNullOrWhiteSpace(encrykey)) { EntityBuf.EntityBufCore.Serialize(message, _sendBufferManger, ref bufferindex, ref size, ref data); } else { data = EntityBuf.EntityBufCore.Serialize(message); } if (bufferindex == -1) { if (!string.IsNullOrWhiteSpace(encrykey)) { using (var ms = new System.IO.MemoryStream()) { for (int i = 0; i < 8; i++) { ms.WriteByte(0); } var enbytes = AesEncryHelper.AesEncrypt(data, encrykey); ms.Write(enbytes, 0, enbytes.Length); data = ms.ToArray(); } } byte[] dataLen = BitConverter.GetBytes(data.Length - 4); for (int i = 0; i < 4; i++) { data[i] = dataLen[i]; } var crc32 = HashEncrypt.GetCRC32(data, 8); //LogManager.LogHelper.Instance.Debug("校验值:" + crc32); var crc32bytes = BitConverter.GetBytes(crc32); for (int i = 4; i < 8; i++) { data[i] = crc32bytes[i - 4]; } lock (s) { var sendcount = s.Send(data, SocketFlags.None); //if (SocketApplicationEnvironment.TraceSocketDataBag && !string.IsNullOrWhiteSpace(message.MessageHeader.TransactionID)) //{ // LogManager.LogHelper.Instance.Debug(s.Handle + "发送数据:" + message.MessageHeader.TransactionID + "长度:" + data.Length + ", " + Convert.ToBase64String(data)); //} return(sendcount); } } else { try { //LogManager.LogHelper.Instance.Error("发送数据bufferindex:" + bufferindex + ",size:" + size); byte[] dataLen = BitConverter.GetBytes((int)size - 4); int offset = _sendBufferManger.GetOffset(bufferindex); for (int i = 0; i < 4; i++) { _sendBufferManger.Buffer[i + offset] = dataLen[i]; } var crc32 = HashEncrypt.GetCRC32(_sendBufferManger.Buffer, offset + 8, (int)size - 8); //LogManager.LogHelper.Instance.Debug("校验值:" + crc32); var crc32bytes = BitConverter.GetBytes(crc32); for (int i = 4; i < 8; i++) { _sendBufferManger.Buffer[i + offset] = crc32bytes[i - 4]; } int sendcount = 0; lock (s) { SocketError senderror = SocketError.Success; sendcount = s.Send(_sendBufferManger.Buffer, offset, (int)size, SocketFlags.None, out senderror); //if (SocketApplicationEnvironment.TraceSocketDataBag && !string.IsNullOrWhiteSpace(message.MessageHeader.TransactionID)) //{ // var sendbytes = _sendBufferManger.Buffer.Skip(offset).Take((int)size).ToArray(); // LogManager.LogHelper.Instance.Debug(s.Handle + "发送数据:" + message.MessageHeader.TransactionID + "长度:" + size + ", " + Convert.ToBase64String(sendbytes)); //} if (senderror != SocketError.Success) { throw new Exception(senderror.ToString()); } } return(sendcount); } finally { _sendBufferManger.RealseBuffer(bufferindex); } } } catch (Exception ex) { ex.Data.Add("TransactionID", message.MessageHeader.TransactionID); throw new SocketApplicationException("SendMessage fail", ex); } }
void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e) { e.Completed -= SocketAsyncEventArgs_Completed; var args = e as IOCPSocketAsyncEventArgs; if (args.BytesTransferred == 0 || args.SocketError != SocketError.Success) { //if (SocketApplication.SocketApplicationEnvironment.TraceSocketDataBag) //{ // LogManager.LogHelper.Instance.Debug(e.AcceptSocket.Handle + "异常断开:" + args.SocketError); //} RemoveSession(args); return; } else { bool hasdataerror = false; try { #region 数据逻辑 if (!args.IsReadPackLen) { if (args.BytesTransferred != 4) { throw new Exception("读取长度失败"); } var offset = args.BufferIndex == -1 ? 0 : _bufferpoll.GetOffset(args.BufferIndex); var dataLen = BitConverter.ToInt32(e.Buffer, offset); //if (SocketApplication.SocketApplicationEnvironment.TraceSocketDataBag) //{ // LogManager.LogHelper.Instance.Debug(e.AcceptSocket.Handle + "准备接收数据:长度" + dataLen, null); //} if (dataLen > MaxPackageLength || dataLen <= 0) { throw new SocketSessionDataException(string.Format("数据异常,长度:" + dataLen)); } else { args.IsReadPackLen = true; //byte[] readbuffer = new byte[dataLen]; args.BufferLen = dataLen; args.BufferRev = 0; //args.SetBuffer(readbuffer, 0, dataLen); SetBuffer(args, 0, dataLen); } } else { //if (SocketApplication.SocketApplicationEnvironment.TraceSocketDataBag) //{ // var offset1 = (args.BufferLen == args.Buffer.Length) ? 0 : _bufferpoll.GetOffset(args.BufferIndex); // var bytes = args.Buffer.Skip(offset1 + args.BufferRev).Take(args.BytesTransferred).ToArray(); // //if (args.BytesTransferred < args.BufferLen) // { // LogManager.LogHelper.Instance.Debug(string.Format(e.AcceptSocket.Handle + "接收数据{0}/{1}/{2},{3}", args.BufferLen, args.BufferRev, args.BytesTransferred, Convert.ToBase64String(bytes)), null); // } //} args.BufferRev += args.BytesTransferred; Exception messageError = null; if (args.BufferRev == args.BufferLen) { byte[] bt = null; var offset = args.BufferIndex == -1 ? 0 : _bufferpoll.GetOffset(args.BufferIndex); //校验 var crc32 = BitConverter.ToInt32(args.Buffer, offset); var calcrc32 = HashEncrypt.GetCRC32(args.Buffer, offset + 4, args.BufferLen - 4); if (calcrc32 == crc32) { bt = new byte[args.BufferLen - 4]; for (int i = 4; i < args.BufferLen; i++) { bt[i - 4] = args.Buffer[offset + i]; } ThreadPool.QueueUserWorkItem(new WaitCallback((buf) => { Session connSession = null; try { Message message = null; if (_connectSocketDic.TryGetValue(args.UserToken.ToString(), out connSession)) { if (!string.IsNullOrWhiteSpace(connSession.EncryKey)) { try { bt = AesEncryHelper.AesDecrypt(bt, connSession.EncryKey); } catch (Exception ex) { throw new SocketApplicationException("解密失败", ex); } } try { message = EntityBufCore.DeSerialize <Message>(bt); } catch (Exception ex) { messageError = ex; } connSession.LastSessionTime = DateTime.Now; connSession.BytesRev += bt.Length; if (messageError == null) { //如果是协商加密的 if (message.IsMessage(MessageType.NEGOTIATIONENCRYR)) { var nmsg = message.GetMessageBody <NegotiationEncryMessage>(); if (string.IsNullOrWhiteSpace(nmsg.PublicKey)) { throw new SocketApplicationException("公钥错误"); } var encrykey = connSession.EncryKey; if (string.IsNullOrWhiteSpace(encrykey)) { encrykey = Guid.NewGuid().ToString("N"); Console.WriteLine("发送加密串:" + encrykey); var rep = new Message(MessageType.NEGOTIATIONENCRYR); rep.SetMessageBody(nmsg); nmsg.EncryKey = Convert.ToBase64String(RsaEncryHelper.RsaEncrypt(Encoding.ASCII.GetBytes(encrykey), nmsg.PublicKey));; connSession.SendMessage(rep); connSession.EncryKey = encrykey; } else { throw new SocketApplicationException("不允许多次协商密钥"); } } else { FromApp(message, connSession); } } else { OnError(messageError); } } else { OnError(new Exception("取会话失败,args.UserToken=" + args.UserToken)); } } catch (SocketApplicationException ex) { if (connSession != null) { connSession.Close(); } ex.Data.Add("SessionID", connSession.SessionID); OnError(ex); } }), bt); } else { messageError = new Exception("检查校验码出错"); messageError.Data.Add("crc32", crc32); messageError.Data.Add("calcrc32", calcrc32); messageError.Data.Add("data", bt == null ? "" : Convert.ToBase64String(bt)); //LogManager.LogHelper.Instance.Error("接收数据出错", messageError); Session connSession; if (_connectSocketDic.TryGetValue(args.UserToken.ToString(), out connSession)) { connSession.LastSessionTime = DateTime.Now; connSession.BytesRev += args.BufferRev; OnError(messageError); } else { OnError(new Exception("取会话失败,args.UserToken=" + args.UserToken)); } } args.IsReadPackLen = false; //args.SetBuffer(_bufferpoll.Buffer, _bufferpoll.GetOffset(args.BufferIndex), 4); SetBuffer(args, 0, 4); } else { SetBuffer(args, args.BufferRev, args.BufferLen - args.BufferRev); //LogManager.LogHelper.Instance.Debug("e.SetBuffer:" + (args.BufferRev) + ",len:" + (args.BufferLen - args.BufferRev), null); } } #endregion } catch (SocketSessionDataException ex) { RemoveSession(args); hasdataerror = true; OnError(ex); } catch (Exception ex) { OnError(ex); } finally { if (!hasdataerror) { e.Completed += SocketAsyncEventArgs_Completed; if (!e.AcceptSocket.ReceiveAsync(e)) { //LogManager.LogHelper.Instance.Debug(e.AcceptSocket.Handle + "同步完成,手动处理", null); SocketAsyncEventArgs_Completed(null, e); } } } } }