// 投递发送数据请求 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); }
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); }
// 投递接收数据请求 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); }
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(); } }
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; } }
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; } } }