Ejemplo n.º 1
0
 private void EndSendPacket(IAsyncResult ar)
 {
     try
     {
         lock (_socket) { _socket.EndSend(ar); }
     }
     catch (Exception ex) { NetLog.Error(ex.Message); }
 }
Ejemplo n.º 2
0
 // 接受包数据
 public void BeginReceivePacket()
 {
     try
     {
         lock (_socket)
         {
             _socket.BeginReceive(_receive_buffer, 0, _socket.ReceiveBufferSize,
                                  SocketFlags.None, EndReceivePacket, null);
         }
     }
     catch (Exception ex) { NetLog.Error(ex.StackTrace); }
 }
Ejemplo n.º 3
0
        /// <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();
        }