Beispiel #1
0
        // 投递发送数据请求
        public bool IocpPostSend(Packet packet)
        {
            Socket  sock   = packet.socketCtx.sock;
            PackBuf p_wbuf = packet.packBuf;

            IAsyncResult ret = sock.BeginSend(p_wbuf.buf, 0, (int)p_wbuf.len, SocketFlags.None,
                                              new AsyncCallback(OnSendCallBack),
                                              packet);

            return(true);
        }
Beispiel #2
0
        public bool IocpPostConnect(Packet packet)
        {
            Socket     sock       = packet.socketCtx.sock;
            PackBuf    p_wbuf     = packet.packBuf;
            ServerInfo serverInfo = packet.socketCtx.GetRemoteServerInfo();

            IPAddress    mIp          = IPAddress.Parse(serverInfo.serverIP);
            IPEndPoint   ip_end_point = new IPEndPoint(mIp, serverInfo.serverPort);
            IAsyncResult ret          = sock.BeginConnect(ip_end_point, OnConnectCallBack, packet);

            return(true);
        }
Beispiel #3
0
        // 投递接收数据请求
        public bool IocpPostRecv(Packet packet)
        {
            Socket  sock   = packet.socketCtx.sock;
            PackBuf p_wbuf = packet.packBuf;

            IAsyncResult ret = sock.BeginReceive(p_wbuf.buf /*消息缓存*/,
                                                 0 /*接受消息的偏移量 就是从第几个开始*/,
                                                 (int)p_wbuf.len /*设置接受字节数*/,
                                                 SocketFlags.None /*Socket标志位*/,
                                                 new AsyncCallback(OnReceiveCallBack) /*接受回调*/,
                                                 packet /*最后的状态*/);

            return(true);
        }
Beispiel #4
0
        void ReleaseCachePackBuf()
        {
            PackBuf cachePackBuf = curtDepacketSocket.unPackCache;

            if (cachePackBuf.buf != null)
            {
                cachePackBuf.buf = null;
                cachePackBuf.len = 0;
                curtDepacketSocket.unPackCacheSize = 0;
                curtDepacketSocket.cachePack       = null;
                curtDepacketSocket.cachePackOffset = 0;
                curtDepacketSocket.cachePackLen    = 0;
                curtDepacketSocket.unPackCalcLen   = -1;
                curtDepacketSocket.unPackHeadLen   = GetPackHeadPreLength();
            }
        }
Beispiel #5
0
        void CreateCachePackBuf()
        {
            PackBuf cachePackBuf = curtDepacketSocket.unPackCache;

            if (cachePackBuf.buf == null)
            {
                curtDepacketSocket.unPackCacheSize = GetMaxBufferSize() * 2;
                cachePackBuf.buf = new byte[curtDepacketSocket.unPackCacheSize];
                cachePackBuf.len = cachePackLen;

                Buffer.BlockCopy(cachePack, (int)cachePackOffset, cachePackBuf.buf, 0, (int)cachePackLen);
                curtDepacketSocket.cachePack       = cachePack;
                curtDepacketSocket.cachePackOffset = cachePackOffset;
                curtDepacketSocket.cachePackLen    = cachePackLen;
            }
        }
Beispiel #6
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;
                }
            }
        }