public void MainProcess() { while (true) { Monitor.Enter(rudp); UdpChunk c = rudp.RecvBuffOut(); Monitor.Exit(rudp); if (c == null) { break; } if (c.size < 6) { break; } int size = NetTool.BytesToInt32(c.buff, 0); int uid = NetTool.BytesToInt32(c.buff, 4); int msgid = NetTool.BytesToInt32(c.buff, 8); Type type = UdpMsg.proto(msgid); if (type == null) { break; } } }
UdpChunk UpdSendBuffOut() { LinkedListNode <UdpChunk> n = sendQueue.First; if (n == null) { return; } UdpChunk c = n.Value; return(c); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PushQueueFront // AddFirst // PushQueueBack // AddLast // PushQueueAfter // AddAfter public void PushQueueBackSort(LinkedList <UdpChunk> q, UdpChunk c) { LinkedListNode <UdpChunk> n = q.Last; while (n != null) { if (n.Value.seq <= c.seq) { q.AddAfter(n, c); return; } n = n.Previous; } q.AddLast(c); }
void UdpSendBuffIn(byte[] buff, int size) { if (size > UdpConst.udpDataMaxLen) { return; } UdpChunk c = new UdpChunk(); c.size = size; c.type = UdpConst.udpTypeData; c.seq = ++sendSeq; c.ack = recvMinSeq; Array.Copy(buff, c.buff, size); sendQueue.AddLast(c); }
void SendReqAgain() { if (recvMinSeq == recvMaxSeq) { return; } UdpChunk c = new UdpChunk(); c.size = 0; c.type = UdpConst.udpTypeReqSeq; c.seq = 0; c.ack = recvMinSeq + 1; sendQueue.AddFirst(c); ++reqTimes; }
// UdpRecvBuffOut // UdpRecvBuffOutProcess public UdpChunk UdpRecvBuffOut() { LinkedListNode <UdpChunk> n = recvQueue.First; if (n == null) { return(null); } UdpChunk c = n.Value; if (c.seq <= recvMinSeq) { return(c); } return(null); }
// UdpRecvBuffIn // public void UdpRecvBuffInProcess(UdpChunk c, int sz) { // if (c == null) { // return; // } // if (sz < UdpConst.udpHeadByteAll || // sz > UdpConst.udpDataMaxLen + UdpConst.udpHeadByteAll) { // return; // } // if (c.size + UdpConst.udpHeadByteAll != sz) { // return; // } // switch (c.type) { // case UdpConst.udpTypeReqSeq: // { // UdpChunk cAgain = PopQueueBySeq(sendHistory, c.ack); // if (cAgain == null) { // break; // } // sendQueue.AddFirst(cAgain); // } // case UdpConst.udpTypeSynAck: // break; // case UdpConst.udpTypeData: // case UdpConst.udpTypeDataAgain: // if (recvMinSeq >= c.seq) { // break; // } // if (PushQueueBackSortCheckSame(recvQueue, c)) { // // recv cur in // if (recvMinSeq < c.seq) { // RecvMinSeqUpdate(); // } // if (recvMaxSeq < c.seq) { // recvMaxSeq = c.seq; // } // if (recvMaxAck < c.ack) { // recvMaxAck = c.ack; // SendHistoryClear(); // } // recvTick = curTick; // } // } // } public void UdpRecvBuffIn(UdpChunk c) { switch (c.type) { case UdpConst.udpTypeReqSeq: { UdpChunk cAgain = PopQueueBySeq(sendHistory, c.ack); if (cAgain == null) { break; } sendQueue.AddFirst(cAgain); } case UdpConst.udpTypeSynAck: break; case UdpConst.udpTypeData: case UdpConst.udpTypeDataAgain: if (recvMinSeq <= c.seq) { break; } if (PushQueueBackSortCheckSame(recvQueue, c)) { // recv cur in = null if (recvMinSeq < c.seq) { RecvMinSeqUpdate(); } if (recvMaxSeq < c.seq) { recvMaxSeq = c.seq; } if (recvMaxAck < c.ack) { recvMaxAck = c.ack; SendHistoryClear(); } recvTick = curTick; } default: break; } }
public bool PushQueueBackSortCheckSame(LinkedList <UdpChunk> q, UdpChunk c) { LinkedListNode <UdpChunk> n = q.Last; while (n != null) { if (n.Value.seq == c.seq) { return(false); } if (n.Value.seq < c.seq) { q.AddAfter(n, c); return(true); } n = n.Previous; } q.AddLast(c); return(true); }
private void NetProcess() { byte[] sendBuff = new byte[1024]; byte[] recvBuff = new byte[1024]; while (true) { do { if (clientSocket == null) { break; } if (!clientSocket.poll(0, SelectMode.SelectRead)) { break; } int len = clientSocket.ReceiveFrom(recvBuff, ref serverPoint); if (len <= 0) { break; } if (len < UdpConst.udpHeadByteAll) { break; } int size = NetTool.BytesToInt8(ref recvBuff, 0); if (len < size + UdpConst.udpHeadByteAll) { break; } UdpChunk c = new UdpChunk(); c.size = NetTool.BytesToInt8(ref recvBuff, 0); c.type = NetTool.BytesToInt8(ref recvBuff, 1); c.seq = NetTool.BytesToInt32(ref recvBuff, 2); c.ack = NetTool.BytesToInt32(ref recvBuff, 6); Array.Copy(recvBuff, 10, c.buff, 0, c.size); Monitor.Enter(rudp); rudp.RecvBuffIn(c); Monitor.Exit(rudp); } while (false); do { if (clientSocket == null) { break; } Monitor.Enter(rudp); UdpChunk c = rudp.SendBuffOut(); Monitor.Exit(rudp); if (c == null) { break; } if (!clientSocket.poll(0, SelectMode.SelectWrite)) { Monitor.Enter(rudp); UdpChunk c = rudp.SendChunkForce(c); Monitor.Exit(rudp); break; } NetTool.Int8ToBytes(sendBuff, 0, c.size); NetTool.Int8ToBytes(sendBuff, 1, c.type); NetTool.Int32ToBytes(sendBuff, 2, c.seq); NetTool.Int32ToBytes(sendBuff, 6, c.ack); Array.Copy(c.buff, 0, sendBuff, 10, c.size); int dataLen = c.size + UdpConst.udpHeadByteAll; int len = clientSocket.SendTo(sendBuff, dataLen, SocketFlags.None, serverPoint); if (len < dataLen) { Monitor.Enter(rudp); UdpChunk c = rudp.SendChunkForce(c); Monitor.Exit(rudp); } } while (false); Thread.Sleep(10); } }