private void EndSendPacket(IAsyncResult ar) { try { lock (_socket) { _socket.EndSend(ar); } } catch (Exception ex) { NetLog.Error(ex.Message); } }
// 接受包数据 public void BeginReceivePacket() { try { lock (_socket) { _socket.BeginReceive(_receive_buffer, 0, _socket.ReceiveBufferSize, SocketFlags.None, EndReceivePacket, null); } } catch (Exception ex) { NetLog.Error(ex.StackTrace); } }
/// <summary> /// /// </summary> /// <param name="ar"></param> public void EndReceivePacket(IAsyncResult ar) { int bytes_read = -1; try { if (IsConncted) { lock (_socket) { bytes_read = _socket.EndReceive(ar); } } if (bytes_read == -1) { CloseConnection(); return; } } catch (ObjectDisposedException) { NetLog.Error("Receive Closed"); } catch (Exception ex) { NetLog.Error("{0}\n{1}\n{2}", ex.Message, ex.StackTrace, ex.Source); } NetLog.Assert(bytes_read < NetworkConst.MAX_BUFF_SIZE, "接收到的包太长了"); // Begin Read // int position = 0; // MsgID : 4 | PacketLength : 4 |PACKET : dynamic while (position < bytes_read) { int buffer_size = NetworkHelper.ReadBufferSize(_receive_buffer, ref position /*position + HEAD_SIZE * 0*/); int msg_id = NetworkHelper.ReadMsgId(_receive_buffer, ref position); int msg_data_size = NetworkHelper.ReadPbLength(_receive_buffer, ref position); // TODO 确认心跳线程 // KEEP_ALIVE_SYNC // 保证整个Buffer长度 if (position + msg_data_size > bytes_read) { LogManager.Error("Error receive packet, packet is too long : " + buffer_size); break; } // 接包; IExtensible rsp_packet = UnPackTool.UnPack1(ref position, msg_data_size, _receive_buffer, msg_id); if (rsp_packet == null) { continue; } // 确认某一个消息已经Req_Finish RaiseMessage(); // position += msg_data_size; } Array.Clear(_receive_buffer, 0, _socket.ReceiveBufferSize); BeginReceivePacket(); }