예제 #1
0
        void RecvedTask(object data)
        {
            Packet    packet    = (Packet)data;
            NetSocket socketCtx = packet.socketCtx;
            Server    server    = GetServer();

            if (CheckingPacketVaild(packet) == 0)
            {
                return;
            }

            SocketError socketError = System.Net.Sockets.SocketError.Success;

            packet.transferedBytes = socketCtx.sock.EndReceive(packet.ar, out socketError);

            if (socketError != System.Net.Sockets.SocketError.Success)
            {
                SocketError(socketCtx);
                return;
            }

            socketCtx.UpdataTimeStamp();

            if (socketCtx.dataTransMode == DataTransMode.MODE_PACK)
            {
                socketCtx.dePacketor.SetCurtPack(socketCtx, packet.buf, packet.transferedBytes);
                int ret = socketCtx.dePacketor.Extract();

                if (ret == 2)
                {
                    socketCtx.SetSocketState(SocketState.RECV_DATA_TOO_BIG);
                    SocketError(socketCtx.GetID());
                }
            }
            else
            {
                socketCtx.SetPack(packet.buf, 0, packet.transferedBytes);
                socketCtx.dePacketor.UnPack(SocketEvent.EV_SOCKET_RECV, socketCtx);
                socketCtx.RemovePack();
            }

            // 然后开始投递下一个WSARecv请求
            server.IocpPostRecv(packet);
        }
예제 #2
0
        void AcceptedClientTask(object data)
        {
            Packet    packet    = (Packet)data;
            NetSocket socketCtx = packet.socketCtx;
            Server    server    = GetServer();

            // 把这个有效的客户端信息,加入到socketMap中去
            socketMap[socketCtx.GetID()] = socketCtx;

            socketCtx.SetPack(packet.buf, 0, packet.transferedBytes);
            socketCtx.dePacketor.UnPack(SocketEvent.EV_SOCKET_ACCEPTED, socketCtx);
            socketCtx.RemovePack();

            int bufSize = socketCtx.dePacketor.GetMaxBufferSize();

            if (packet.packBuf.len != bufSize)
            {
                packet = socketCtx.CreatePacket(bufSize);
            }

            server.IocpPostRecv(packet);
        }
예제 #3
0
        public int Extract()
        {
            int     calcPackLen  = curtDepacketSocket.unPackCalcLen; //当前接受包的一个完整消息的长度
            int     packHeadLen  = curtDepacketSocket.unPackHeadLen;
            PackBuf cachePackBuf = curtDepacketSocket.unPackCache;
            int     realPackHeadLen;

            if (cachePackBuf.buf != null)
            {
                int richBufLen = curtDepacketSocket.unPackCacheSize - cachePackBuf.len;

                //新来的数据包curtPack的长度curtPackLen, 不大于缓存cachePackBuf中的富余长度richBufLen
                if (curtPackLen <= richBufLen)
                {
                    Buffer.BlockCopy(curtPack, 0, cachePackBuf.buf, (int)cachePackBuf.len, (int)curtPackLen);
                    cachePackBuf.len += curtPackLen;
                }
                else
                {
                    if (curtDepacketSocket.cachePackLen + curtPackLen > curtDepacketSocket.unPackCacheSize)
                    {
                        curtDepacketSocket.unPackCacheSize *= 2;
                        cachePackBuf.buf = new byte[curtDepacketSocket.unPackCacheSize];
                    }
                    else if (curtDepacketSocket.cachePackLen > curtDepacketSocket.cachePackOffset)
                    {
                        //curtDepacketSocket->cachePack是在cachePackBuf->buf中的指针位置
                        cachePackBuf.buf = new byte[curtDepacketSocket.unPackCacheSize];
                    }

                    cachePackBuf.len = curtDepacketSocket.cachePackLen;
                    Buffer.BlockCopy(curtDepacketSocket.cachePack, (int)curtDepacketSocket.cachePackOffset, cachePackBuf.buf, 0, (int)curtDepacketSocket.cachePackLen);
                    Buffer.BlockCopy(curtPack, 0, cachePackBuf.buf, (int)cachePackBuf.len, (int)curtPackLen);
                    cachePackBuf.len += curtPackLen;

                    curtDepacketSocket.cachePack       = cachePackBuf.buf;
                    curtDepacketSocket.cachePackOffset = 0;
                    curtDepacketSocket.cachePackLen    = cachePackBuf.len;
                }

                cachePack       = cachePackBuf.buf;
                cachePackLen    = cachePackBuf.len;
                cachePackOffset = 0;
            }
            else
            {
                cachePack       = curtPack;
                cachePackLen    = curtPackLen;
                cachePackOffset = 0;
            }

            while (true)
            {
                switch (curtDepacketSocket.extractState)
                {
                case ExtractState.ES_PACKET_HEADLEN_NOT_GET:
                {
                    if (cachePackLen >= packHeadLen)
                    {
                        calcPackLen = GetPackLength(cachePack, cachePackOffset, cachePackLen, out realPackHeadLen);         //根据包头中的信息,获取包数据长度
                        curtDepacketSocket.unPackCalcLen = calcPackLen;
                        packHeadLen = curtDepacketSocket.unPackHeadLen = realPackHeadLen;

                        if (packHeadLen < 0)
                        {
                            CreateCachePackBuf();
                            curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEADLEN_NOT_GET;
                            return(1);
                        }
                        else if (calcPackLen < 0)
                        {
                            CreateCachePackBuf();
                            curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEAD_NOT_FULL;
                            return(1);
                        }
                        else
                        {
                            curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEAD_FULL;
                        }
                    }
                    else          //此次包头长度不完整
                    {
                        CreateCachePackBuf();
                        curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEADLEN_NOT_GET;
                        return(1);
                    }
                }
                break;

                case ExtractState.ES_PACKET_HEAD_FULL:
                {
                    if (calcPackLen == cachePackLen)           //刚好获取的是一个完整的数据包
                    {
                        curtDepacketSocket.SetPack(cachePack, cachePackOffset, cachePackLen);
                        UnPack(SocketEvent.EV_SOCKET_RECV, curtDepacketSocket);
                        curtDepacketSocket.RemovePack();

                        ReleaseCachePackBuf();
                        curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEADLEN_NOT_GET;
                        return(0);
                    }
                    else if (calcPackLen < cachePackLen)           //获取的数据包长度大于一个完整数据包的长度
                    {
                        curtDepacketSocket.SetPack(cachePack, cachePackOffset, calcPackLen);
                        UnPack(SocketEvent.EV_SOCKET_RECV, curtDepacketSocket);

                        curtDepacketSocket.RemovePack();

                        cachePackOffset += calcPackLen;
                        cachePackLen    -= calcPackLen;
                        curtDepacketSocket.cachePack       = cachePack;
                        curtDepacketSocket.cachePackOffset = cachePackOffset;
                        curtDepacketSocket.cachePackLen    = cachePackLen;

                        curtDepacketSocket.extractState  = ExtractState.ES_PACKET_HEADLEN_NOT_GET;
                        curtDepacketSocket.unPackCalcLen = -1;
                        packHeadLen = curtDepacketSocket.unPackHeadLen = GetPackHeadPreLength();
                    }
                    else           //获取的数据包不完整
                    {
                        if (calcPackLen > GetMaxBufferSize())
                        {
                            curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEADLEN_NOT_GET;
                            return(2);
                        }

                        CreateCachePackBuf();
                        curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEAD_FULL;
                        return(1);
                    }
                }

                break;


                case ExtractState.ES_PACKET_HEAD_NOT_FULL:
                {
                    int leavePackHeadLen = packHeadLen - (int)cachePackLen;

                    if (curtPackLen < leavePackHeadLen)           //包头信息依然不足
                    {
                        curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEAD_NOT_FULL;
                        return(1);
                    }
                    else           //不完整数据包中获取到完整的包头信息了
                    {
                        curtDepacketSocket.extractState = ExtractState.ES_PACKET_HEAD_FULL;
                    }
                }

                break;
                }
            }
        }