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); }
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); }
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; } } }